AIProxyServer - คู่มือ

รัน 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 แรกของคุณ

  1. เลือก provider ใดก็ได้จากรายการ Providers (เช่น OpenAI (ChatGPT))
  2. คลิก Get API key เพื่อเปิดคอนโซลของ provider ในเบราว์เซอร์ จากนั้นสร้างหรือคัดลอก key
  3. คลิก Set API Key ในแถวเดียวกันและวางค่าลงในไดอะล็อก
  4. คลิก 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

ฟิลด์คำอธิบาย
StatusRunning เมื่อ listener ทำงานอยู่ และ Stopped เมื่อหยุด
Base URLที่อยู่ที่แอปไคลเอนต์ควรใช้ รวมถึง hostname และพอร์ต คลิก Copy เพื่อคัดลอกไปยังคลิปบอร์ด
ปุ่ม Start / Stopสลับ HTTP listener โดยไม่ต้องออกจากแอป

แผง Bearer Token

  • Require Bearer Token authentication — กล่องเครื่องหมายเปิดหรือปิดการรับรองตัวตน ปิดโดยค่าเริ่มต้นเพื่อการใช้งานภายในเครื่องโดยไม่ยุ่งยาก
  • Token field — แสดง token ปัจจุบันแบบอ่านอย่างเดียว แสดงเป็นจุดๆ ใช้ Copy เพื่อหยิบ
  • Regenerate — ออก token สุ่มใหม่ ไคลเอนต์ที่มีอยู่ต้องได้รับการอัปเดตด้วยค่าใหม่
โปรดระวัง: หากคุณเปิดใช้ Allow LAN Access ใน Settings โดยไม่ได้เปิด token ทุกคนในเครือข่าย Wi-Fi เดียวกันสามารถใช้ proxy ของคุณและ API keys ของคุณได้ ข้อความคำใบ้ใต้แผง 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 เท่านั้น

ProviderRoute prefixสิ่งที่คุณต้องมี
OpenAI (ChatGPT)/openai/v1API key จาก platform.openai.com
Claude (Anthropic)/anthropic/v1API key จาก Anthropic Console
Gemini (Google)/gemini/v1API key จาก Google AI Studio
Grok (xAI)/grok/v1API key จาก xAI Console
Azure OpenAI (Copilot)/copilot/v1API key พร้อม URL ของ deployment endpoint
Perplexity/perplexity/v1API key จากการตั้งค่า Perplexity
Groq/groq/v1API key จาก Groq Cloud
DeepSeek/deepseek/v1API key จาก DeepSeek Platform
Kimi (Moonshot)/kimi/v1API key จาก Moonshot Console
Qwen (DashScope)/qwen/v1API 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-4o proxy จะต่อท้าย /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

MethodPathคำอธิบาย
GET/healthการตรวจสอบความมีชีวิต ส่งคืนสถานะบริการและรายการ provider ไม่ต้องรับรองตัวตน
GET/v1/providersproviders ที่กำหนดค่าไว้และ 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 Port8421พอร์ต TCP ที่ listener จะ bind การเปลี่ยนแปลงต้องรีสตาร์ท proxy
Auto Start ServerOnเริ่ม proxy เมื่อแอปเปิดขึ้น
Allow LAN AccessOffเมื่อปิด proxy จะ bind เฉพาะกับ 127.0.0.1 เท่านั้น เมื่อเปิด อุปกรณ์อื่นบน Wi-Fi ของคุณสามารถเข้าถึง proxy ได้
Require Bearer TokenOffเมื่อเปิด ทุกคำขอต้องมี 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
);
อุปกรณ์มือถือบน Wi-Fi: แทนที่ 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 ส่งต่อไบต์และลืมทันที