| --- |
| title: ChatMock |
| emoji: 🤖 |
| colorFrom: blue |
| colorTo: indigo |
| sdk: docker |
| pinned: false |
| --- |
| <div align="center"> |
|
|
| # ChatMock |
|
|
| **Allows Codex to work in your favourite chat apps and coding tools.** |
|
|
| [](https://pypi.org/project/chatmock/) |
| [](https://pypi.org/project/chatmock/) |
| [](LICENSE) |
| [](https://github.com/RayBytes/ChatMock/stargazers) |
| [](https://github.com/RayBytes/ChatMock/commits/main) |
| [](https://github.com/RayBytes/ChatMock/issues) |
|
|
| <br> |
|
|
|
|
| </div> |
|
|
| <br> |
|
|
| ## Install |
|
|
| #### Homebrew |
| ```bash |
| brew tap RayBytes/chatmock |
| brew install chatmock |
| ``` |
|
|
| #### pipx / pip |
| ```bash |
| pipx install chatmock |
| ``` |
|
|
| #### GUI |
| Download from [releases](https://github.com/RayBytes/ChatMock/releases) (macOS & Windows) |
|
|
| #### Docker |
| See [DOCKER.md](DOCKER.md) |
|
|
| #### Hugging Face |
| See [Hugging Face Deployment](#hugging-face-deployment) |
|
|
| <br> |
|
|
| ## Getting Started |
|
|
| ```bash |
| # 1. Sign in with your ChatGPT account |
| chatmock login |
| |
| # 2. Start the server |
| chatmock serve |
| ``` |
|
|
| The server runs at `http://127.0.0.1:8000` by default. Use `http://127.0.0.1:8000/v1` as your base URL for OpenAI-compatible apps. |
|
|
| <br> |
|
|
| ## Usage |
|
|
| <details open> |
| <summary><b>Python</b></summary> |
|
|
| ```python |
| from openai import OpenAI |
| |
| client = OpenAI( |
| base_url="http://127.0.0.1:8000/v1", |
| api_key="anything" # not checked |
| ) |
| |
| response = client.chat.completions.create( |
| model="gpt-5.4", |
| messages=[{"role": "user", "content": "hello"}] |
| ) |
| print(response.choices[0].message.content) |
| ``` |
|
|
| </details> |
|
|
| <details> |
| <summary><b>cURL</b></summary> |
|
|
| ```bash |
| curl http://127.0.0.1:8000/v1/chat/completions \ |
| -H "Content-Type: application/json" \ |
| -d '{ |
| "model": "gpt-5.4", |
| "messages": [{"role": "user", "content": "hello"}] |
| }' |
| ``` |
|
|
| </details> |
|
|
| <details> |
| <summary><b>Custom API (Plain Text)</b></summary> |
|
|
| ```bash |
| # Request format: {"prompt": "..."} |
| # Response format: {"status": "success", "text": "..."} |
| |
| curl http://127.0.0.1:8000/api \ |
| -H "Content-Type: application/json" \ |
| -d '{"prompt": "hello"}' |
| |
| # You can also specify the model in the URL |
| curl http://127.0.0.1:8000/gpt-5.5/api \ |
| -H "Content-Type: application/json" \ |
| -d '{"prompt": "hello"}' |
| ``` |
|
|
| </details> |
|
|
| <br> |
|
|
| ## Supported Models |
|
|
| - `gpt-5.5` |
| - `gpt-5.4` |
| - `gpt-5.4-mini` |
| - `gpt-5.2` |
| - `gpt-5.1` |
| - `gpt-5` |
| - `gpt-5.3-codex` |
| - `gpt-5.3-codex-spark` |
| - `gpt-5.2-codex` |
| - `gpt-5-codex` |
| - `gpt-5.1-codex` |
| - `gpt-5.1-codex-max` |
| - `gpt-5.1-codex-mini` |
| - `codex-mini` |
|
|
| <br> |
|
|
| ## Features |
|
|
| - Tool / function calling |
| - Vision / image input |
| - Thinking summaries (via think tags) |
| - Configurable thinking effort |
| - Fast mode for supported models |
| - Web search tool |
| - OpenAI-compatible `/v1/responses` (HTTP + WebSocket) |
| - Ollama-compatible endpoints |
| - Reasoning effort exposed as separate models (optional) |
|
|
| <br> |
|
|
| ## Configuration |
|
|
| All flags go after `chatmock serve`. These can also be set as environment variables. |
|
|
| | Flag | Env var | Options | Default | Description | |
| |------|---------|---------|---------|-------------| |
| | `--reasoning-effort` | `CHATGPT_LOCAL_REASONING_EFFORT` | none, minimal, low, medium, high, xhigh | medium | How hard the model thinks | |
| | `--reasoning-summary` | `CHATGPT_LOCAL_REASONING_SUMMARY` | auto, concise, detailed, none | auto | Thinking summary verbosity | |
| | `--reasoning-compat` | `CHATGPT_LOCAL_REASONING_COMPAT` | legacy, o3, think-tags | think-tags | How reasoning is returned to the client | |
| | `--fast-mode` | `CHATGPT_LOCAL_FAST_MODE` | true/false | false | Priority processing for supported models | |
| | `--enable-web-search` | `CHATGPT_LOCAL_ENABLE_WEB_SEARCH` | true/false | false | Allow the model to search the web | |
| | `--expose-reasoning-models` | `CHATGPT_LOCAL_EXPOSE_REASONING_MODELS` | true/false | false | List each reasoning level as its own model | |
|
|
| <details> |
| <summary><b>Web search in a request</b></summary> |
|
|
| ```json |
| { |
| "model": "gpt-5.4", |
| "messages": [{"role": "user", "content": "latest news on ..."}], |
| "responses_tools": [{"type": "web_search"}], |
| "responses_tool_choice": "auto" |
| } |
| ``` |
|
|
| </details> |
|
|
| <details> |
| <summary><b>Fast mode in a request</b></summary> |
|
|
| ```json |
| { |
| "model": "gpt-5.4", |
| "input": "summarize this", |
| "fast_mode": true |
| } |
| ``` |
|
|
| </details> |
|
|
| <br> |
|
|
| ## Notes |
|
|
| Use responsibly and at your own risk. This project is not affiliated with OpenAI. |
|
|
| <br> |
|
|
| ## Hugging Face Deployment |
|
|
| 1. **Get Auth**: Run `python chatmock.py info --json` locally and copy the output. |
| 2. **Create Space**: Create a new **Docker** Space on Hugging Face. |
| 3. **Upload**: Upload all project files to the Space. |
| 4. **Secret**: In Space Settings, add a secret named `AUTH_JSON` and paste your auth data as the value. |
| 5. **Done**: Your API will be available at `https://<user>-<space>.hf.space/api` |
|
|
| ### Updating / Refreshing Session |
|
|
| If your API starts returning "Not signed in" errors, your session has likely expired. To fix it: |
| 1. Run `chatmock login` on your local computer. |
| 2. Run `python chatmock.py info --json` and copy the new output. |
| 3. Go to your Space **Settings** -> **Variables and secrets**. |
| 4. Edit the `AUTH_JSON` secret and paste the new value. |
| 5. Save and the Space will automatically restart with the fresh session. |
|
|
| <br> |
|
|
| ## Star History |
|
|
| [](https://www.star-history.com/#RayBytes/ChatMock&Timeline) |
|
|
|
|
| python chatmock.py info --json |
|
|
|
|
| copy whole output of the command and paste it in the secret |
|
|
| { |
| "auth_mode": "chatgpt", |
| "OPENAI_API_KEY": null, |
| "tokens": { |
| "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImIxZGQzZjhmLTlhYWQtNDdmZS1iMGU3LWVkYjAwOTc3N2Q2YiIsInR5cCI6IkpXVCJ9.eyJhdF9oYXNoIjoiWDVkOGNQVkdxWnNtcDc0dnBxRG9tdyIsImF1ZCI6WyJhcHBfRU1vYW1FRVo3M2YwQ2tYYVhwN2hyYW5uIl0sImF1dGhfcHJvdmlkZXIiOiJnb29nbGUiLCJhdXRoX3RpbWUiOjE3NzUwMzA4NzYsImVtYWlsIjoiZ2cucmVoYW4xMjM0QGdtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJleHAiOjE3Nzc2MTI1ODQsImh0dHBzOi8vYXBpLm9wZW5haS5jb20vYXV0aCI6eyJjaGF0Z3B0X2FjY291bnRfaWQiOiJhMWYyZGIxNy1mMmM0LTQ2YmQtYTkzNC0wN2IyMTNmNTQyNGYiLCJjaGF0Z3B0X3BsYW5fdHlwZSI6ImdvIiwiY2hhdGdwdF9zdWJzY3JpcHRpb25fYWN0aXZlX3N0YXJ0IjoiMjAyNS0xMS0wNFQwMjo0MDozOSswMDowMCIsImNoYXRncHRfc3Vic2NyaXB0aW9uX2FjdGl2ZV91bnRpbCI6IjIwMjYtMTEtMDRUMDI6NDA6MDArMDA6MDAiLCJjaGF0Z3B0X3N1YnNjcmlwdGlvbl9sYXN0X2NoZWNrZWQiOiIyMDI2LTA0LTAxVDA4OjA3OjU2LjUyNDczOSswMDowMCIsImNoYXRncHRfdXNlcl9pZCI6InVzZXItaG9pS212bnRwanpIY2ZwQ1VVY0NWQUVhIiwiZ3JvdXBzIjpbXSwibG9jYWxob3N0Ijp0cnVlLCJvcmdhbml6YXRpb25zIjpbeyJpZCI6Im9yZy1zQzF6aVA1eGhqNXo4NnRjV1BqTXNjYm8iLCJpc19kZWZhdWx0Ijp0cnVlLCJyb2xlIjoib3duZXIiLCJ0aXRsZSI6InJlaGFuIn0seyJpZCI6Im9yZy1FMzBKN2dRekg1M1NVelBsSVFDUVRBZmYiLCJpc19kZWZhdWx0IjpmYWxzZSwicm9sZSI6Im93bmVyIiwidGl0bGUiOiJQZXJzb25hbCJ9XSwidXNlcl9pZCI6InVzZXItaG9pS212bnRwanpIY2ZwQ1VVY0NWQUVhIn0sImlhdCI6MTc3NzYwODk4NCwiaXNzIjoiaHR0cHM6Ly9hdXRoLm9wZW5haS5jb20iLCJqdGkiOiI1MTA4ZWNiYi1lNmMyLTRlNzEtYTE0Ni1kYmExMTQzMjFmY2EiLCJuYW1lIjoiUmVoYW4gR2FtZXIiLCJyYXQiOjE3NzUwMzA4NjYsInNpZCI6IjRiNTA1MzI4LTIxNzctNGU1Ni04MGI5LTVlYjk3OGRlZTgyYiIsInN1YiI6Imdvb2dsZS1vYXV0aDJ8MTE2MTk1NTU1MzUyOTYyNTAxNzU5In0.XipII74SWIUFNjC5XtqbL4d-usrKv0K2dSnPBt6Z5U6gGQExxPN50MfbyJymupd6IQP5eFjIF5An8O8JFNeJlKqg5dDHAZzkej1lyPTerYpGsbLhG1_nPk1As_TJ9U4yO24GBturjwcPaSgWQSMouv9YD7m7mbQ6lWFkuoKxNGA0NUKSAwp65awccKYndKnZ9iObOA7McGHOPwAXvDDPaoJRK67cNDSE8WSCFyW5ZqyzrJ3WbsaG-0k2vrVl0k5zka3kL1xxljqNdIUrensBZYYhUEy_zYvsbHczkSNzpYn3mCFlkNts1zp5EvWZXt4yStNeHhJwjNYkJylJQnG6u1O2tzgGfU-Di_DH1XY8S1M8DGuci92SQ2u3Kp8njRLy2ywD2yvz59hJhheWbaAwPWR9EhxizA-upEfyO65mQSaETSBaFRcL8d5hI6soaDHoeCxSsJYdzvsH8jwzxWI0vOp1r2_1u2BsDlLOTJ-NzheB4FqnQqzs4QmTSR_7wF4u3XI34DHqTEKzvrpAcAk4YGKRrWAEIzYmHSwMvUe_Rmw8OcBJkQpPvqLlODMAdPVGJ3lBz2FvrIWCor0-LUIK3A8LBqBYhmBdbyrZRedNS3V2W6M_T4Vk1QrEquLqqFa_lU7BMtYIL3w6v7oBxUozE_Ey3ndMw_Nop_gLBKxkgI8", |
| "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjE5MzQ0ZTY1LWJiYzktNDRkMS1hOWQwLWY5NTdiMDc5YmQwZSIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSJdLCJjbGllbnRfaWQiOiJhcHBfRU1vYW1FRVo3M2YwQ2tYYVhwN2hyYW5uIiwiZXhwIjoxNzc4NDcyOTg1LCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsiY2hhdGdwdF9hY2NvdW50X2lkIjoiYTFmMmRiMTctZjJjNC00NmJkLWE5MzQtMDdiMjEzZjU0MjRmIiwiY2hhdGdwdF9hY2NvdW50X3VzZXJfaWQiOiJ1c2VyLWhvaUttdm50cGp6SGNmcENVVWNDVkFFYV9fYTFmMmRiMTctZjJjNC00NmJkLWE5MzQtMDdiMjEzZjU0MjRmIiwiY2hhdGdwdF9jb21wdXRlX3Jlc2lkZW5jeSI6Im5vX2NvbnN0cmFpbnQiLCJjaGF0Z3B0X3BsYW5fdHlwZSI6ImdvIiwiY2hhdGdwdF91c2VyX2lkIjoidXNlci1ob2lLbXZudHBqekhjZnBDVVVjQ1ZBRWEiLCJsb2NhbGhvc3QiOnRydWUsInVzZXJfaWQiOiJ1c2VyLWhvaUttdm50cGp6SGNmcENVVWNDVkFFYSJ9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJnZy5yZWhhbjEyMzRAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9LCJpYXQiOjE3Nzc2MDg5ODQsImlzcyI6Imh0dHBzOi8vYXV0aC5vcGVuYWkuY29tIiwianRpIjoiNGIxZWZjMjQtMGE5NS00MGNhLThiOWYtNTVhZTI3YjU0YTcxIiwibmJmIjoxNzc3NjA4OTg0LCJwd2RfYXV0aF90aW1lIjoxNzc1MDMwODc2NTI0LCJzY3AiOlsib3BlbmlkIiwicHJvZmlsZSIsImVtYWlsIiwib2ZmbGluZV9hY2Nlc3MiLCJhcGkuY29ubmVjdG9ycy5yZWFkIiwiYXBpLmNvbm5lY3RvcnMuaW52b2tlIl0sInNlc3Npb25faWQiOiJhdXRoc2Vzc19SeHRsemNHS3hTaFo3WFFnRkIxTU9DRjciLCJzbCI6dHJ1ZSwic3ViIjoiZ29vZ2xlLW9hdXRoMnwxMTYxOTU1NTUzNTI5NjI1MDE3NTkifQ.15hsGF4sq4nJkOCmydaPjkHU6wwd_6gqi-E6yonICyktZ68-KWbSW5S5hGY6OHcQ51d8XdqfsE-O2g734oZDyla9tvmkVMLfHcNeEIfnjy0HwbmoqjbJvnJuvOTbRvWEffbGsOZW42PdhhCDHvHFpM0JAU9ll89nOIpPOEL8Cr9wosHaMJu4TVIvuQmrrKdNxOBCo2S9d8wNEcWMMg-4sKLSi9VJ2Rqq1ZqRqUDg33WFQ1ycWpqtgVcaNqtKGfIE2xh_83J-_5AuLAV8w2SEvq3x4DKaBk_yqnPYEF9XflzTz0QIlDihdnS0papYo_GkU2PumxCnWN_4nEwmd52KKgzIOkdsI5xfQpiyZKrudjnJasxmu0s1yb48jYpWUmWA3wLgmjmnERdE460rEvmVKaO_WkhfqomnNUEHSlRyXX4qzqQFxyq_sDaVBXZJY5a1ncqspXUi_VmXfAwz7KtSyMSeKmSaRIPp-c1Jy9Zut9C4D3nOwVuRtNlThghdeeFV9zWAVDwcSFCik-3fEbEEZ8uclYa-sCy5agwxsFFCHJbrTv2ZCvUOeSR8jlKI0UIugFsrTTxQ9WK8d2jjXy6AorCnlxxjtlTMzZcWOMwvNiSGtjF2D7HChWu6kKb2zHgXZRdWD0zXJnoV3sM2Hnx8SbAaPyheob35hP6p4wcHYNw", |
| "refresh_token": "rt_LHMo6b6cqiSsJkwbp5LLnZoFOYmv-ZN3Kb0nTuRey9Q.arZgKwXuOopbbFXeQUVBhiLcNkYRP_e5ilkRit9bzaY", |
| "account_id": "a1f2db17-f2c4-46bd-a934-07b213f5424f" |
| }, |
| "last_refresh": "2026-05-01T04:16:26.900951Z" |
| } |