{"id":13478682,"url":"https://github.com/yufeikang/raycast_api_proxy","last_synced_at":"2026-01-17T07:58:32.443Z","repository":{"id":163990203,"uuid":"639447928","full_name":"yufeikang/raycast_api_proxy","owner":"yufeikang","description":"This is a simple Raycast AI API proxy.","archived":false,"fork":false,"pushed_at":"2025-02-27T13:09:17.000Z","size":1088,"stargazers_count":341,"open_issues_count":8,"forks_count":54,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-02-27T13:47:02.069Z","etag":null,"topics":["chatgpt","gemini-api","openai-api","raycast"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yufeikang.png","metadata":{"files":{"readme":"README.ja.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-11T13:40:02.000Z","updated_at":"2025-02-27T13:09:20.000Z","dependencies_parsed_at":"2024-04-11T09:46:18.748Z","dependency_job_id":"030c219b-03de-41c3-97e1-d89859e775f9","html_url":"https://github.com/yufeikang/raycast_api_proxy","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yufeikang%2Fraycast_api_proxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yufeikang%2Fraycast_api_proxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yufeikang%2Fraycast_api_proxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yufeikang%2Fraycast_api_proxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yufeikang","download_url":"https://codeload.github.com/yufeikang/raycast_api_proxy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245809652,"owners_count":20676027,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chatgpt","gemini-api","openai-api","raycast"],"created_at":"2024-07-31T16:02:00.689Z","updated_at":"2025-03-27T08:30:50.338Z","avatar_url":"https://github.com/yufeikang.png","language":"Python","readme":"# Raycast AI プロキシ\n\nこれは、シンプルな [Raycast AI](https://raycast.com/) API プロキシです。サブスクリプションなしで [Raycast\nAI](https://raycast.com/ai)を使用できる代替手段です。このプロキシは、RaycastのリクエストをOpenAIのAPIに変換し、応答をリアルタイムで変換してRaycastに転送します。\n\n[English](README.md) | [中文](README.zh.md) | [日本語](README.ja.md)\n\n## 紹介\n\n本プロジェクトはミドルマンプロキシの方式を採用し、RaycastのリクエストをOpenAIのAPIに転送し、OpenAIの応答をRaycastに転送します。\n\n本プロジェクトは以下のインターフェイスを主にマッピングしています：\n\n- `GET /api/v1/me`: ユーザーのAI機能のフラグを変更\n- `POST /api/v1/translations`: 翻訳インターフェイス\n- `POST /api/v1/ai/chat_completions`: AI機能の共通インターフェイス\n- `GET /api/v1/ai/models`: AIモデルのリストインターフェイス\n\nミドルマンプロキシの簡単な原理は、DNSを変更してRaycastのリクエストのIPを本プロジェクトのアドレスに向け、その後リクエストをOpenAIのAPIに転送し、そこで得た応答をRaycastに転送することです。\nしかし、RaycastとRaycast\nAPIの間ではHTTPSが使用されているため、自署証明書が必要であり、Raycastがその証明書を信頼する必要があります。詳細なミドルマンプロキシの原理については(\u003chttps://docs.mitmproxy.org/stable/conc\u003e\nepts-howmitmproxyworks/)をご参照ください。\n\n### AI拡張機能\n\n![ai extension](./assert/img/ai_ext.png)\n\n### サポートされているモデル\n\u003e\n\u003e 複数のモデルを同時に使用することが可能で、ただし環境変数を設定する必要があります\n\n| モデルプロバイダー | モデル | テスト状況 | 画像生成 | Web検索 | AI拡張機能 |\n| --- | --- | --- | --- | --- | --- |\n| `openai` | **from api** | テスト済み | サポート | 未サポート | サポート |\n| `azure openai` | 同上 | テスト済み | サポート | 未サポート | 未サポート |\n| `google` | **from api** | テスト済み | 未サポート | **from api** | 未サポート |\n| `anthropic` | claude-3-sonnet, claude-3-opus, claude-3-5-opus | テスト済み | 未サポート | 未サポート | 未サポート |\n\n#### サポートされている OpenAI API 互換プロバイダー\n\n##### [Ollama](https://ollama.com/) の例\n\n環境変数を追加\n\n- `OPENAI_PROVIDER=ollama`\n- `OPENAI_BASE_URL=http://localhost:11434/v1`\n- `OPENAI_API_KEY=ollama` # 必須ですが、使用されません\n\nモデルは `http://localhost:11434/v1/models` から取得されます。\n\n### CLI の使用方法\n\nパッケージを直接実行する場合（Dockerを使用しない場合）、以下のCLIオプションが利用可能です：\n\n```sh\nraycast_proxy run [OPTIONS]\n\nOptions:\n  --host TEXT      バインドするホストアドレス (デフォルト: 0.0.0.0)\n  --port INTEGER   バインドするポート (SSLが有効な場合は443、無効な場合は80がデフォルト)\n  --ssl/--no-ssl  SSLを有効にする (デフォルト: False)\n  --cert-file TEXT SSL証明書ファイルのパス (未指定の場合は自動生成)\n  --key-file TEXT  SSL秘密鍵ファイルのパス (未指定の場合は自動生成)\n  --domain TEXT    SSL証明書のドメイン (デフォルト: backend.raycast.com)\n  --log-level TEXT ログレベル (デフォルト: INFO)\n```\n\n使用例：\n\n```sh\n# SSLと独自のポートを使用して実行\nraycast_proxy run --ssl --port 8443 --cert-file ./cert/cert.pem --key-file ./cert/key.pem\n\n# SSLを使用せず、ポート8080で実行\nraycast_proxy run --no-ssl --port 8080\n\n# カスタムドメインとログレベルを使用して実行\nraycast_proxy run --ssl --domain custom.domain.com --log-level DEBUG\n```\n\n### Ai チャット\n\n![ai chat](./assert/img/chat.jpeg)\n\n### 翻訳\n\n!(./assert/img/translate.jpg)\n\n## 使用方法\n\n### インストールと設定\n\n#### 1. 証明書を生成\n\n```sh\npip3 install mitmproxy\npython -c \"$(curl -fsSL https://raw.githubusercontent.com/yufeikang/raycast_api_proxy/main/scripts/cert_gen.py)\"  --domain backend.raycast.com  --out ./cert\n```\n\nあるいは\n\nこのリポジトリをクローンし、以下のコマンドを実行\n\n```sh\npip install uv\nuv venv\nsource .venv/bin/activate\nuv pip install -e \".[dev]\"\npython scripts/cert_gen.py --domain backend.raycast.com --out ./cert\n```\n\n#### 2. 証明書をシステムキーチェーンに信頼として追加\n\n`cert` フォルダ内のCA証明書を開き、システムキーチェーンに追加して信頼する必要があります。\nこれは**必須**です。Raycast AI プロキシは自署証明書を使用しているため、それを信頼しなければ正常に動作しません。\n\n注意：\n\nApple\nSilicon搭載のmacOSを使用している場合、手動で`鍵のアクセス`にCA証明書を追加する際にアプリケーションがハングする問題が発生した場合には、以下のコマンドをターミナルで使用して代替することがで\nきます：\n\n(\u003chttps://docs.mitmproxy.org/stable/concepts-certificates/#installing-the-mitmproxy-ca-certificate-manually\u003e)\n\n```shell\nsudo security add-trusted-cert -d -p ssl -p basic -k /Library/Keychains/System.keychain ~/.mitmproxy/mitmproxy-ca-cert.pem\n```\n\n#### 3. `/etc/hosts` ファイルを編集し、以下の行を追加\n\n```\n127.0.0.1 backend.raycast.com\n::1 backend.raycast.com\n```\n\nこの変更の目的は、`backend.raycast.com`をローカルアドレス（127.0.0.1）に向けることで、実際の`backend.raycast.com`ではなくプロキシにリクエストを送信することです。\n\n当然ながら、独自のDNSサーバーにこのレコードを追加することも可能です。最終的な目的は、`backend.raycast.com`をプロキシのデプロイアドレスに向けることです。ここでの127.0.0.1は、デプロイアド\nレスに置き換えることができます。このプロジェクトをクラウドやローカルネットワークにデプロイした場合、そのデプロイアドレスに向けるように設定できます。\n\n#### 4. サービスを起動\n\n```sh\ndocker run --name raycast \\\n    -e OPENAI_API_KEY=$OPENAI_API_KEY \\\n    -p 443:443 \\\n    --dns 1.1.1.1 \\\n    -v $PWD/cert/:/data/cert \\\n    -e CERT_FILE=/data/cert/backend.raycast.com.cert.pem \\\n    -e CERT_KEY=/data/cert/backend.raycast.com.key.pem \\\n    -e LOG_LEVEL=INFO \\\n    -d \\\n    ghcr.io/yufeikang/raycast_api_proxy:main\n```\n\nこのサービスをクラウドまたはローカルネットワークにデプロイし、Raycastがそのアドレスにアクセスできるようにすることも可能です。\n\n**その後、Raycastを再起動して使用を開始できます。**\n\n### 高度な設定\n\n#### 1. Azure OpenAI APIを使用する\n\n[How to switch between OpenAI and Azure OpenAI endpoints with Python](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/switching-endpoints)を参考にしてください。\n\n適切な環境変数を設定するだけでOKです。\n\n```sh\ndocker run --name raycast \\\n    -e OPENAI_API_KEY=$OPENAI_API_KEY \\\n    -e OPENAI_BASE_URL=https://your-resource.openai.azure.com \\\n    -e OPENAI_API_VERSION=2023-05-15 \\\n    -e OPENAI_API_TYPE=azure \\\n    -e AZURE_DEPLOYMENT_ID=your-deployment-id \\\n    -p 443:443 \\\n    --dns 1.1.1.1 \\\n    -v $PWD/cert/:/data/cert \\\n    -e CERT_FILE=/data/cert/backend.raycast.com.cert.pem \\\n    -e CERT_KEY=/data/cert/backend.raycast.com.key.pem \\\n    -e LOG_LEVEL=INFO \\\n    -d \\\n    ghcr.io/yufeikang/raycast_api_proxy:main\n```\n\n#### 2. Google Gemini APIの使用\n\n\u003e OpenAI APIと併せて同時に使用することが可能です。必要に応じて環境変数を設定するだけです。\n\n[Google API Key](https://makersuite.google.com/app/apikey)を取得し、それを`GOOGLE_API_KEY`として環境変数にエクスポートします。\n\n```sh\n# このリポジトリをクローンしてディレクトリに移動\ndocker build -t raycast .\ndocker run --name raycast \\\n    -e GOOGLE_API_KEY=$GOOGLE_API_KEY \\\n    -p 443:443 \\\n    --dns 1.1.1.1 \\\n    -v $PWD/cert/:/data/cert \\\n    -e CERT_FILE=/data/cert/backend.raycast.com.cert.pem \\\n    -e CERT_KEY=/data/cert/backend.raycast.com.key.pem \\\n    -e LOG_LEVEL=INFO \\\n    -d \\\n    raycast:latest\n```\n\n#### 3. ローカルで手動起動\n\n1. このリポジトリをクローンします\n2. 依存関係をインストール：\n\n```sh\npip install uv\nuv venv\nsource .venv/bin/activate\nuv pip install -e \".[dev]\"\n```\n\n3. 環境変数を作成：\n\n```sh\nexport OPENAI_API_KEY=\u003cyour openai api key\u003e\n```\n\n4. 自署証明書を生成：\n\n```sh\npython scripts/cert_gen.py --domain backend.raycast.com --out ./cert\n```\n\n5. サービスを起動：\n\n```sh\npython ./raycast_proxy/main.py\n```\n\n#### 4. ローカル開発\n\nローカル開発中にDNSがループしてしまうのを避けるために、Dockerを使用し、指定したDNSで開発環境を起動することが推奨されます。\n\n参考：\n\n```sh\nsh ./local_docker.sh\n```\n\n#### 5. カスタムマッピングの使用\n\nプロジェクトディレクトリ内の`custom_mapping.yml.example`ファイルを参考にして、いくつかのインターフェイスの応答をカスタムマッピングで変更することができます。\n\n```yaml\n\"api/v1/me/trial_status\":\n  get:\n    response:\n      body:\n        # jsonパスの置換\n        \"$.trial_limits.commands_limit\": 30\n```\n\n例えば上記の設定では、`GET api/v1/me/trial_status` インターフェイスの応答の中で `$.trial_limits.commands_limit` を `30` に置き換えます。それぞれの`$.trial_limits.commands_limit` は\n(\u003chttps://goessner.net/articles/JsonPath/\u003e) です。\n\n現在のところ、レスポンスボディの置換のみサポートされています。\n\n#### 6. 複数ユーザーの共有サービス\n\n複数のユーザーがこのサービスを共有する場合や、サービスをパブリックにデプロイする場合、サービスを使用できるユーザーを制限することができます。 `ALLOWED_USERS`\n環境変数を設定して、このサービスを使用できるユーザーを制限します。\n\n```env\nALLOWED_USERS=\"xx@example.com,yy@example.com\"\n```\n\nメールアドレスはRaycastユーザーのメールアドレスであり、複数のユーザーはカンマで区切ります。\n\n### 注意事項\n\n1. DNS指定\nGFWの存在により、中国国内で使用する場合、国内のDNSサーバーを指定する必要がある場合があります。例： `--dns 223.5.5.5`\n\n2. DNSの無効化\nmacOSで`/etc/hosts`ファイルを変更してもDNSが有効にならない場合があり、現時点での解決方法は見つかっていません。Raycastを再起動するか、`/etc/hosts`ファイルを再編集する方法が有効になること\nがあります。\n","funding_links":[],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyufeikang%2Fraycast_api_proxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyufeikang%2Fraycast_api_proxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyufeikang%2Fraycast_api_proxy/lists"}