รัน proxy ที่เข้ากันได้กับ OpenAI ในเครื่องสำหรับบริการ AI บนคลาวด์รายใหญ่ทุกราย เก็บ API keys เพียงครั้งเดียวและให้แอปไคลเอนต์ใดๆ ไม่ว่าจะเป็นเดสก์ท็อป มือถือ หรือเว็บ สื่อสารกับ http://localhost แทนการลงทะเบียน keys ในทุกเครื่องมือ
เริ่มต้นใช้งาน
1. เปิดแอป
เปิด AIProxyServer เมื่อเปิดครั้งแรก proxy จะเริ่มทำงานโดยอัตโนมัติและฟังที่พอร์ต 8421 ของเครื่องของคุณ หน้าต่างหลักจะแสดงสามส่วน:
- Proxy Server — สถานะปัจจุบัน, base URL และปุ่มสำหรับเริ่มหรือหยุด listener
- Bearer Token — สวิตช์เปิด/ปิดการรับรองตัวตนแบบทางเลือกและการแสดง token
- Providers — ผู้ให้บริการ AI บนคลาวด์ที่รองรับทั้งหมด พร้อมปุ่ม Set API Key ในแต่ละแถว
2. เพิ่ม API Key แรกของคุณ
- เลือก provider ใดก็ได้จากรายการ Providers (เช่น OpenAI (ChatGPT))
- คลิก Get API key เพื่อเปิดคอนโซลของ provider ในเบราว์เซอร์ จากนั้นสร้างหรือคัดลอก key
- คลิก Set API Key ในแถวเดียวกันและวางค่าลงในไดอะล็อก
- คลิก Save ป้ายสถานะจะเปลี่ยนเป็น Configured สีเขียว
3. เชื่อมต่อแอปไคลเอนต์
ชี้ไคลเอนต์ที่เข้ากันได้กับ OpenAI ใดๆ ไปยัง proxy Base URL คือ http://localhost:8421/<provider>/v1 ส่วน provider จะเลือกว่าคลาวด์ใดจะได้รับคำขอ
# Example: OpenAI Python SDK pointed at the proxy
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8421/openai/v1",
api_key="not-used-but-required-by-sdk",
)
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Hello"}],
)
print(resp.choices[0].message.content)
ไคลเอนต์จะไม่เห็น key จริงเลย AIProxyServer จะแนบข้อมูลรับรอง upstream เมื่อส่งต่อคำขอ
ภาพรวมของอินเทอร์เฟซ
แผง Proxy Server
| ฟิลด์ | คำอธิบาย |
|---|---|
| Status | Running เมื่อ listener ทำงานอยู่ และ Stopped เมื่อหยุด |
| Base URL | ที่อยู่ที่แอปไคลเอนต์ควรใช้ รวมถึง hostname และพอร์ต คลิก Copy เพื่อคัดลอกไปยังคลิปบอร์ด |
| ปุ่ม Start / Stop | สลับ HTTP listener โดยไม่ต้องออกจากแอป |
แผง Bearer Token
- Require Bearer Token authentication — กล่องเครื่องหมายเปิดหรือปิดการรับรองตัวตน ปิดโดยค่าเริ่มต้นเพื่อการใช้งานภายในเครื่องโดยไม่ยุ่งยาก
- Token field — แสดง token ปัจจุบันแบบอ่านอย่างเดียว แสดงเป็นจุดๆ ใช้ Copy เพื่อหยิบ
- Regenerate — ออก token สุ่มใหม่ ไคลเอนต์ที่มีอยู่ต้องได้รับการอัปเดตด้วยค่าใหม่
แผง Providers
หนึ่งแถวต่อหนึ่ง provider บนคลาวด์ที่รองรับ แต่ละแถวจะแสดง:
- ชื่อที่แสดง (เช่น Claude (Anthropic))
- สถานะการกำหนดค่า — Configured สีเขียวเมื่อบันทึก API key แล้ว และ Not configured สีเทาเมื่อยังไม่ได้บันทึก
- เส้นทาง URL ที่ไคลเอนต์ของคุณใช้ เช่น
/anthropic/v1/chat/completions - Set API Key — เปิดไดอะล็อกเพื่อกรอกข้อมูลรับรอง
- Get API key — เปิดคอนโซลของ provider ในเบราว์เซอร์
Providers ที่รองรับ
มีบริการ AI บนคลาวด์ 11 รายการที่รวมมาให้ ส่วนใหญ่ใช้รูปแบบ OpenAI Chat Completions เป็นภาษาหลักและถูก proxy โดยตรง สามรายการ (Anthropic, Gemini, ERNIE) ใช้โปรโตคอลของตัวเอง; AIProxyServer แปลคำขอและการตอบกลับทันทีเพื่อให้ไคลเอนต์ของคุณเห็นเฉพาะรูปแบบของ OpenAI เท่านั้น
| Provider | Route prefix | สิ่งที่คุณต้องมี |
|---|---|---|
| OpenAI (ChatGPT) | /openai/v1 | API key จาก platform.openai.com |
| Claude (Anthropic) | /anthropic/v1 | API key จาก Anthropic Console |
| Gemini (Google) | /gemini/v1 | API key จาก Google AI Studio |
| Grok (xAI) | /grok/v1 | API key จาก xAI Console |
| Azure OpenAI (Copilot) | /copilot/v1 | API key พร้อม URL ของ deployment endpoint |
| Perplexity | /perplexity/v1 | API key จากการตั้งค่า Perplexity |
| Groq | /groq/v1 | API key จาก Groq Cloud |
| DeepSeek | /deepseek/v1 | API key จาก DeepSeek Platform |
| Kimi (Moonshot) | /kimi/v1 | API key จาก Moonshot Console |
| Qwen (DashScope) | /qwen/v1 | API key จาก Alibaba DashScope |
| ERNIE (Baidu) | /ernie/v1 | ทั้ง API Key และ Secret Key จาก Baidu Qianfan |
หมายเหตุเฉพาะ provider
- Azure OpenAI — วาง deployment endpoint แบบเต็มในฟิลด์ Endpoint Base URL เช่น
https://my-resource.openai.azure.com/openai/deployments/gpt-4oproxy จะต่อท้าย/chat/completions?api-version=2024-02-01ให้โดยอัตโนมัติ - ERNIE — Baidu Qianfan ใช้ OAuth ดังนั้นจึงต้องมีทั้ง API Key และ Secret Key AIProxyServer จะร้องขอและแคช access tokens ในเบื้องหลัง
- Gemini — การรับรองตัวตนทำผ่าน URL query parameter; proxy จะเพิ่มให้คุณ โควต้าต่อนาทีของระดับฟรียังคงมีผลใช้บังคับ
API Reference
Endpoints
| Method | Path | คำอธิบาย |
|---|---|---|
| GET | /health | การตรวจสอบความมีชีวิต ส่งคืนสถานะบริการและรายการ provider ไม่ต้องรับรองตัวตน |
| GET | /v1/providers | providers ที่กำหนดค่าไว้และ metadata |
| GET | /<provider>/v1/models | รายการโมเดลสำหรับ provider ที่ระบุ ในรูปแบบ OpenAI |
| POST | /<provider>/v1/chat/completions | คำขอ OpenAI Chat Completions ส่ง stream:true สำหรับ SSE |
Streaming
เมื่อไคลเอนต์ส่ง "stream": true proxy จะตอบกลับด้วย Server-Sent Events ในรูปแบบของ OpenAI:
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"delta":{"role":"assistant"},...}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"delta":{"content":"Hello"},...}]}
data: [DONE]
สตรีมเนทีฟของ Anthropic และ Gemini จะถูกแปลเป็นรูปแบบนี้เพื่อให้ไคลเอนต์ทั้งหมดสามารถใช้ parser ตัวเดียวได้
เฮดเดอร์การรับรองตัวตน
เมื่อ Require Bearer Token authentication เปิดอยู่ ให้ส่ง token จากหน้าต่างหลักไปกับทุกคำขอ:
Authorization: Bearer <token-shown-in-app>
การตั้งค่า
เปิดหน้าต่าง Settings จากไอคอนรูปเฟืองในแถบเครื่องมือด้านล่าง
| การตั้งค่า | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|
| Proxy Port | 8421 | พอร์ต TCP ที่ listener จะ bind การเปลี่ยนแปลงต้องรีสตาร์ท proxy |
| Auto Start Server | On | เริ่ม proxy เมื่อแอปเปิดขึ้น |
| Allow LAN Access | Off | เมื่อปิด proxy จะ bind เฉพาะกับ 127.0.0.1 เท่านั้น เมื่อเปิด อุปกรณ์อื่นบน Wi-Fi ของคุณสามารถเข้าถึง proxy ได้ |
| Require Bearer Token | Off | เมื่อเปิด ทุกคำขอต้องมี token ที่แสดงในหน้าต่างหลัก แนะนำอย่างยิ่งเมื่อ Allow LAN Access เปิดอยู่ |
ตัวอย่างไคลเอนต์
cURL
# OpenAI (passthrough)
curl http://localhost:8421/openai/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Hello"}]
}'
# Claude via the same OpenAI shape
curl http://localhost:8421/anthropic/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"messages": [{"role": "user", "content": "Hello"}],
"max_tokens": 1024
}'
OpenAI Python SDK
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8421/gemini/v1",
api_key="placeholder", # ignored when Bearer Token is off
)
stream = client.chat.completions.create(
model="gemini-2.0-flash",
messages=[{"role": "user", "content": "Tell me a joke"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="", flush=True)
Flutter / Dart
// Using any OpenAI-compatible Dart client
final client = OpenAIClient(
baseUrl: 'http://localhost:8421/anthropic/v1',
apiKey: '', // unused when Bearer Token is off
);
localhost ด้วย LAN IP ของ Mac (แสดงในฟิลด์ Base URL เมื่อ Allow LAN Access เปิดอยู่)เคล็ดลับ
- ปิด Bearer Token ไว้ในขณะที่คุณกำลังพัฒนาในเครื่อง; เปิดทันทีที่คุณเปิดใช้งาน LAN access
- ใช้ Base URLs ที่แตกต่างกันต่อ provider ในโค้ดไคลเอนต์ของคุณ เพื่อให้คุณสามารถเปลี่ยน provider ได้โดยการเปลี่ยนค่าคงที่เพียงค่าเดียว
- proxy เริ่มทำงานอัตโนมัติ แต่คุณสามารถหยุดได้ชั่วคราวจากหน้าต่างหลักหากเกิดความขัดแย้งของพอร์ต
- หากระดับฟรีของ provider จำกัดอัตราคุณ ข้อความผิดพลาดจาก upstream จะถูกส่งต่อตามตัวอักษร ไม่มี logic การลองใหม่ที่ซ่อนจากไคลเอนต์
- endpoint
/v1/providersมีประโยชน์ในการค้นหาว่า providers ใดถูกกำหนดค่าในขณะรันไทม์
การแก้ไขปัญหา
proxy ไม่เริ่มทำงาน
- อาจมีกระบวนการอื่นใช้พอร์ต 8421 อยู่แล้ว เปลี่ยนพอร์ตใน Settings และรีสตาร์ท proxy
- ตรวจสอบบันทึกของระบบเพื่อดูข้อความผิดพลาดที่แสดงในเวลาเริ่มต้น
คำขอส่งคืน 401 Unauthorized
- การกำหนดให้ใช้ Bearer Token เปิดอยู่แต่ไคลเอนต์ไม่ได้ส่งเฮดเดอร์
Authorization: Bearer ...ที่ตรงกัน - API key ของ provider เองอาจไม่ถูกต้อง — ข้อผิดพลาด upstream จะถูกส่งต่อ ดังนั้นตรวจสอบเนื้อหาข้อความ
คำขอส่งคืน "API key is not configured"
- เปิดรายการ Providers และคลิก Set API Key สำหรับ provider ที่เกี่ยวข้อง
- สำหรับ ERNIE ต้องกรอกทั้ง API Key และ Secret Key สำหรับ Azure OpenAI ต้องระบุ Endpoint Base URL ด้วย
อุปกรณ์มือถือเข้าถึง proxy ไม่ได้
- เปิด Allow LAN Access ใน Settings
- ใช้ LAN IP ที่แสดงในฟิลด์ Base URL ไม่ใช่
localhost - ตรวจสอบให้แน่ใจว่าอุปกรณ์ทั้งสองอยู่บนเครือข่าย Wi-Fi เดียวกันและไฟร์วอลล์ของคุณอนุญาตการเชื่อมต่อขาเข้าบนพอร์ตของ proxy
การตอบกลับแบบ streaming มาถึงพร้อมกันทั้งหมด
- ตรวจสอบให้แน่ใจว่าไคลเอนต์ของคุณส่ง
"stream": trueใน JSON body - ไลบรารี HTTP บางตัวบัฟเฟอร์ SSE โดยค่าเริ่มต้น — ปิดการบัฟเฟอร์การตอบกลับที่ฝั่งไคลเอนต์
ความเป็นส่วนตัว
- API keys ถูกจัดเก็บแบบเข้ารหัสด้วย Fernet ใน
~/Library/Application Support/AIProxyServer/credentials.encคีย์การเข้ารหัสในmaster.keyมีสิทธิ์ 0600 - Bearer Token เมื่อเปิดใช้งาน จะถูกจัดเก็บไว้ในตู้นิรภัยที่เข้ารหัสเท่านั้น และไม่เคยถูกเขียนลงในไฟล์การตั้งค่าทั่วไป
- proxy ส่งต่อคำขอไปยัง providers ที่คุณได้กำหนดค่าไว้อย่างชัดเจนเท่านั้น ไม่มีการเรียกออกอื่นใด
- ไม่มี telemetry ไม่มี analytics ไม่มีการรายงานการแครช
- การ bind เครือข่ายเริ่มต้นคือ
127.0.0.1เท่านั้น การเปิดเผยต่อ LAN เป็นการเลือกเข้าร่วม - เนื้อหาบทสนทนาไม่ได้รับการจัดเก็บ AIProxyServer ส่งต่อไบต์และลืมทันที