withOhm
ทางการAI ตัวควบคุมการจราจร (chaos governor): Redis prompt replay, การรับข้อมูลเว็บที่ปฏิบัติตามข้อกำหนด, SSO org ledger, Agent Shell. BYOK รองรับการเชื่อมต่อแบบ OpenAI-compatible. Cursor เป็นทางเลือก; MCP เป็นไคลเอนต์ที่เข้ากันได้
คุณทำอะไรได้บ้างด้วย withOhm MCP?
- เล่นซ้ำพรอมต์ที่แคชไว้ — ขอให้ AI ของคุณส่งคำขอที่เหมือนกันอีกครั้งและได้รับการตอบกลับที่เหมือนกันทุกไบต์ด้วย
X-AT-Cache: HITคิดค่าบริการเป็น hit แทนการเรียกโมเดลใหม่ - ตรวจสอบใบรับรองเข้ารหัส — ให้ผู้ช่วยของคุณตรวจสอบ JWS ที่ลงนาม
X-Ohm-Receiptในการตอบกลับใดๆ โดยใช้verify_receipt.pyเพื่อพิสูจน์ว่า hit นั้นจริง ไม่ใช่แค่การอ้าง - ดึงข้อมูลบริบทเว็บสาธารณะ — ใช้
ohm_fetch_webเพื่อดึงหน้าสาธารณะเป็น markdown/JSON ที่ถูกตัดทอน พร้อมบังคับใช้แฟล็กการปฏิบัติตามข้อกำหนด เช่นweb_purposeและweb_compliance_ack - ตรวจสอบการใช้งานและการเรียกเก็บเงิน — คิวรี
ohm_usageเพื่อดูปริมาณการใช้ที่วัดได้จากมิเตอร์ohm_cache_hit,ohm_cache_missและohm_web_fetchพร้อมประมาณการประหยัดข้ามเทนแนนต์ - แชทผ่านพร็อกซี — ใช้
ohm_chatเพื่อส่งคำขอที่เข้ากันได้กับ OpenAI ไปยังผู้ให้บริการใดๆ (OpenAI, Anthropic, Google ฯลฯ) ผ่าน base URL เดียว พร้อม BYOK ผ่านX-Ohm-Upstream-Key
เอกสาร
Ohm (withOhm)
ในหนึ่งประโยค: withOhm คือพร็อกซีที่อยู่ระหว่างแอปของคุณ (หรือ Cursor) กับ OpenAI/Anthropic/ฯลฯ — มันเล่นซ้ำคำขอที่เหมือนกันแบบไบต์ต่อไบต์ได้ฟรี แทนการจ่ายค่าโมเดลใหม่ ดึงข้อมูลเว็บสาธารณะภายใต้การควบคุมการปฏิบัติตามข้อกำหนด และให้ใบแจ้งหนี้เดียวที่ตรวจสอบได้และมีใบรับรองเข้ารหัส แทนที่ใบแจ้งหนี้ของผู้ให้บริการหลายใบที่ไม่โปร่งใส
ท่อที่วัดค่าใช้จ่ายสำหรับการอนุมานซ้ำที่สิ้นเปลือง: ทางเข้าแบบ OpenAI-compatible, Redis prompt replay, การดึงข้อมูลเว็บที่ปฏิบัติตามข้อกำหนด, การเช่าพื้นที่องค์กรแบบ SSO และบัญชีแยกประเภทที่สะอาดสำหรับองค์กร สำหรับองค์กร ท่อเดียวกันนี้คือ ผู้ควบคุมความวุ่นวาย สำหรับการใช้จ่าย AI (wedge หลัก: docs/GEM_POSITION.md) Cursor/MCP เป็นลูกค้าที่เป็นตัวเลือก
การเล่นซ้ำแบบตรงเป๊ะที่ไม่มีค่าใช้จ่าย token ต้นทาง ความสอดคล้องข้ามผู้ให้บริการ ความใกล้ชิด — การอ่านจาก Redis edge การเล่นซ้ำและคุณค่าการตรวจสอบ ชี้ลูกค้า OpenAI-compatible ใดๆ (หรือ Ohm Agent Shell) ไปที่ base URL เดียว เก็บคีย์ของคุณหรือใช้พูลที่จัดการ เช่าท่อ; ควบคุมความวุ่นวาย
เว็บไซต์: https://www.withohm.dev · API: https://api.withohm.dev/v1 · Workbench: /workbench · สถาปัตยกรรม: docs/ARCHITECTURE.md · วิสัยทัศน์: docs/VISION.md · องค์กร: docs/ENTERPRISE_CHAOS.md · Gem: docs/GEM_POSITION.md · การตรวจสอบการดูแล: docs/CARE_AUDIT.md — ระเบียบวินัยในการรักษาความจริงที่ใช้กับทุกข้อกล่าวอ้างสาธารณะ; โปรดอ่านก่อนตัดสินอัตราส่วนวิศวกรรมต่อแรงดึง
ใบอนุญาต: MIT (ดู LICENSE + NOTICE) ซอร์สโค้ดเปิด; ท่อ withOhm ที่โฮสต์ยังคงเป็นบริการเชิงพาณิชย์แบบคิดค่าบริการ ชื่อแพ็กเกจ/คีย์อาจยังใช้ at-utility / sk-at-* (คำนำหน้า AT เดิม); ผลิตภัณฑ์คือ withOhm
ระยะ, อย่างตรงไปตรงมา
ไม่เล่นเล่ห์: withOhm อยู่ในช่วงก่อน seed และก่อน traction โดยการออกแบบ ไม่ใช่เพราะความบกพร่อง ตารางเต็มและกฎการอ้างอิง: docs/STATUS.md
| ข้อเท็จจริง | ตอนนี้ |
|---|---|
| เวอร์ชัน | 0.1.2 |
| พันธมิตรออกแบบ | 0 จากเป้าหมาย 10 ทีม (docs/DESIGN_PARTNERS.md — "จากศูนย์") |
| เงินทุนจากสถาบัน | ไม่มี; ก่อนการจัดตั้งบริษัท (docs/distribution/INVESTOR_INTRO_TARGETS.md) |
| ภูมิภาค | เดียว (us-east-1); ไม่มี SLA ตามสัญญา |
| ความครอบคลุมการทดสอบอัตโนมัติ | ไฟล์ 30 ไฟล์, ฟังก์ชันทดสอบมากกว่า 215 รายการใน tests/ (pytest -q, CI ทุกการ push) |
ระเบียบวินัยด้านวิศวกรรมและการตรวจสอบ (การทดสอบ, ใบรับรองที่ลงนาม, INSPECTION.md, docs/CARE_AUDIT.md) คือสิ่งที่ใช้เวลาในช่วงก่อน traction — โปรดอ่านตัวเลขระยะและระเบียบวินัยร่วมกัน ไม่ใช่แยกกัน
ตรวจสอบด้วยตัวเอง
คำพูดถูก; ทุกข้อกล่าวอ้างที่มีน้ำหนักมาพร้อมคำสั่งที่ตรวจสอบได้
| ข้อกล่าวอ้าง | การตรวจสอบ |
|---|---|
| ท่อทำงาน (ทั้งสองระนาบ) | curl -s https://api.withohm.dev/health && curl -s https://api.withohm.dev/ready |
| การเล่นซ้ำถูกนับและเรียกเก็บเป็น hit | ส่ง body เดียวกันสองครั้ง; การตอบสนองครั้งที่สองมี X-AT-Cache: HIT + X-AT-Billed-USD |
| การเล่นซ้ำคือ cryptographic ไม่ใช่การยืนยัน | การตอบสนองของ hit มี X-Ohm-Receipt (JWS ที่ลงนาม) — ตรวจสอบ: python scripts/verify_receipt.py "<receipt>" (docs/RECEIPTS.md) |
| คีย์การลงนามเป็นสาธารณะ | curl -s https://api.withohm.dev/.well-known/http-message-signatures-directory |
| ขีดจำกัดและการปฏิเสธที่เผยแพร่ | curl -s https://api.withohm.dev/v1/public/honesty — สิ่งที่เราจะไม่ทำ พร้อม endpoint ที่พิสูจน์แต่ละรายการ |
| ตัวนับการประหยัดข้ามผู้เช่า | curl -s https://api.withohm.dev/v1/public/stats (เสมอ estimate_only: true) |
| เส้นทางผู้ตรวจสอบทำงานทุกคืนกับการผลิต | ประวัติเวิร์กโฟลว์ Golden path |
ข้อตกลงนักพัฒนาท้องถิ่น (คงที่)
| บทบาท | ที่อยู่ | หมายเหตุ |
|---|---|---|
| จุดเข้าลูกค้าสาธารณะ | http://localhost:8081/v1 | Rust edge. ชี้ชุดพัฒนา OpenAI ซอฟต์แวร์ที่นี่ |
| ระนาบควบคุมภายใน | http://localhost:8080 | Python FastAPI. Rust พร็อกซีไปที่นี่เมื่อ cache miss. อย่าให้กับคนแปลกหน้า |
| การรับรองความถูกต้อง | Authorization: Bearer <ohm-api-key> | คีย์ bootstrap ท้องถิ่น: sk-at-dev (ดู .env) |
| BYOK | X-Ohm-Upstream-Key: <provider-key> | จำเป็นเมื่อ cache miss สำหรับ gpt/claude เว้นแต่ env/enterprise มีการจัดการคีย์ |
| การเลือกโมเดล | ฟิลด์ JSON model | mock ยังคงท้องถิ่น; gpt-* / o* → OpenAI; claude-* → Anthropic; gemini-* → Google; deepseek-* → DeepSeek; kimi-* / moonshot-* → Moonshot; glm-* → Z.ai; qwen* → Qwen; grok-* → xAI (ทั้งหมด OpenAI-compatible, BYOK) |
from at_utility_sdk import openai_client, LOCAL_BASE_URL
client = openai_client(
"sk-at-dev",
base_url=LOCAL_BASE_URL,
upstream_api_key="sk-proj-...",
)
completion = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Hello"}],
)
เริ่มต้นอย่างรวดเร็ว (Docker Compose)
cd <repo-root> # e.g. clone of iwasinnam2/ohm
copy .env.example .env
# Edit .env: set OPENAI_API_KEY for local env-fallback; keep OPENAI_BASE_URL=https://api.openai.com/v1
docker compose --profile rust up --build -d
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\release_smoke.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\railgun_smoke.ps1
การรันแบบคลาวด์/เอเจนต์เนทีฟ (ไม่ใช้ Docker): ดู AGENTS.md
Release smoke ตรวจสอบสุขภาพ, mock miss/hit, OpenAI miss/hit (เมื่อมีคีย์), ส่วนหัวของ Rust plane และตัวนับการใช้งาน Railgun smoke ตรวจสอบส่วนหัว BYOK, seat_plus_meters และรูปร่างของ checkout endpoint
Cursor / MCP
MCP แบบ stdio ท้องถิ่นบวก remote MCP แบบไม่เก็บสถานะ ผ่าน streamable HTTP (MCP 2026-07-28 stateless core) ฐานสาธารณะ: https://api.withohm.dev/v1 พันธมิตร: docs/LAUNCH_GTM.md · https://www.withohm.dev/design-partners
pip install withohm-mcp
# monorepo dev alternative: pip install -e ".[mcp]"
# stdio (Cursor local attach): set OHM_API_KEY (required). Optional: OHM_UPSTREAM_KEY, OHM_BASE_URL
# Plugin: .cursor-plugin/ + mcp.json — see docs/CURSOR.md
# Remote (stateless streamable HTTP at /mcp, default port 8091):
# OHM_MCP_TRANSPORT=http ohm-mcp (or: ohm-mcp-http)
# Auth is per-request: clients send `Authorization: Bearer sk-at-*`
# (falls back to OHM_API_KEY env). Host allowlist: OHM_MCP_ALLOWED_HOSTS.
ความซื่อสัตย์ในการสตรีมและการเฟลโอเวอร์
- Non-streaming chat completions: Rust edge อาจลอง upstream Python ซ้ำ (URL หลักแล้ว fallback) ก่อนส่งคืน body การเขียนแคชเกิดขึ้นหลังจากการตอบสนองเต็มสำเร็จ
- Streaming chat completions: เฟลโอเวอร์ก่อนไบต์แรกถูกส่ง ระนาบ Python เปิดสตรีม upstream อย่างกระตือรือร้น ลองอีกครั้งถ้ามันตายก่อนไบต์แรก และส่งคืน HTTP error ที่ซื่อสัตย์ (ไม่ใช่สตรีม error-frame 200) ถ้าทั้งสองครั้งล้มเหลว; Rust edge ฟอลแบ็กเมื่อ connect errors หรือ 5xx ก่อนไบต์แรก และส่งต่อ token stream เป็นชิ้นๆ (ไม่มีการบัฟเฟอร์ที่ edge) การสลับผู้ให้บริการกลางสตรีมหลังไบต์แรกโดยไม่ให้ไคลเอนต์เชื่อมต่อใหม่ ไม่ได้รับการสนับสนุน — วางแผนการเชื่อมต่อใหม่หรือ non-stream สำหรับเส้นทางที่สำคัญ
กฎสภาพแวดล้อม
- ความลับที่ใช้งานจริงอยู่ใน
.envเท่านั้น (gitignored) .env.exampleต้องไม่มี OpenAI หรือ Stripe secret ที่ใช้งานจริง- หลังจากเปลี่ยน
.env, สร้างคอนเทนเนอร์ใหม่:docker compose up -d --force-recreate gateway OPENAI_BASE_URLต้องเป็นhttps://api.openai.com/v1, ไม่ใช่โฮสต์เว็บไซต์platform.openai.com
ขอบเขตทางกฎหมาย (บังคับ)
การดึงข้อมูลเว็บเป็น สาธารณะเท่านั้น และจำกัดวัตถุประสงค์ภายใต้บรรทัดฐาน UK GDPR/CMA และ US CFAA/CCPA ทั้ง repo ต้องอยู่ในกรอบนี้—ดู docs/LEGAL.md
เมื่อ fetch_web_context เป็น true, ไคลเอนต์ต้องส่ง:
web_purpose— หนึ่งในpublic_web_retrieval,business_catalog,public_company_info,job_listingsweb_compliance_ack: true— ยืนยันสาธารณะเท่านั้น, ไม่มีการเก็บ lead / dossier / การเข้าถึงแบบ gatedterms_ack/dpa_ack: true— ผูกกับเทมเพลต docs/legal/- ตัวเลือก
cache_control: "no_store"— ข้ามการเขียน Redis สำหรับพรอมพ์ที่เป็นความลับ
ตรวจสอบนโยบายสด: GET /v1/compliance/policy เทมเพลต: ข้อกำหนด, DPA, รายการตรวจสอบ upstream ภายใต้ docs/legal/
สถาปัตยกรรม
| เลเยอร์ | บทบาท |
|---|---|
gateway-rs (:8081) | ขอบสาธารณะ: แคช Redis serialization protocol, พร็อกซี, ส่วนหัวของ plane |
Python gateway (:8080) | API ที่เข้ากันได้กับ OpenAI, ผู้ให้บริการ, อัตราจำกัด, การวัดปริมาณ, การเช่า, ประตูการปฏิบัติตามข้อกำหนด |
Ingest worker (:8090) | Meta-search + การดึงหน้าเว็บสาธารณะ → markdown/JSON ที่ถูกลบข้อมูลสำหรับ fetch_web_context |
src/at_utility/compliance/ | เมทริกซ์วัตถุประสงค์, URL gate, robots.txt, การลบ PII |
src/ohm_mcp/ | Cursor MCP attach (ohm_fetch_web, ohm_usage, ohm_chat) |
| Redis leader / replica | แคช + RL; GET บน replica/reader, SET บน leader — docs/REDIS_MESH.md |
infra/ | Terraform + Kubernetes: EKS ภูมิภาคเดียว (mesh เก็บไว้หลัง flags) |
site/ | การตลาด + เอกสาร + /billing แบบบริการตนเอง |
การเช่าและการเรียกเก็บเงิน
คีย์ bootstrap sk-at-dev ทำงานในท้องถิ่น บริการตนเอง: POST /v1/billing/checkout (เว็บไซต์ /billing) Ops: ออกด้วยคีย์ผู้ดูแล (AT_ADMIN_API_KEYS):
curl.exe -s -X POST http://localhost:8080/v1/admin/tenants `
-H "Authorization: Bearer sk-at-dev" `
-H "Content-Type: application/json" `
-d "{\"plan\":\"payg\",\"label\":\"design-partner-1\",\"terms_ack\":true,\"dpa_ack\":true}"
ผู้เช่าที่ถูกระงับ (POST /v1/admin/tenants/{id}/status กับ {"status":"suspended"}, หรือ Stripe cancel webhook) จะได้รับ HTTP 403
การวัดปริมาณเขียนคีย์บัญชีแยกประเภทรายวันที่ทนทานและซิงค์ Stripe Billing Meters เมื่อตั้งค่า stripe_customer_id (ohm_web_fetch, ohm_cache_hit, ohm_cache_miss)
บัญชีแยกประเภท: ลูกค้าจ่ายผู้ให้บริการ (BYOK) ลูกค้าจ่ายค่า seat และมิเตอร์ของ Ohm ตัวเลือก: pip install -e ".[billing]"
การทดสอบ
pip install -e ".[dev,billing]"
pytest -q