Skip to main content
CID222 Docs

Python SDK

Bir Python istemci kitaplığı planlanıyor ama henüz yayımlanmadı — neleri kapsayacağı ve yayımlanana kadar kullanabileceğiniz requests tabanlı çalışan istemci.

  • Sürüm: 0.4
  • Rol: admin_user, normal_user

Note

CID222 için henüz bir Python istemci kitaplığı yoktur — yayımlanmış bir paket yoktur ve bu sayfadaki hiçbir kurulum komutu bir sonuca ulaşmaz. REST API'yi aşağıda gösterildiği gibi doğrudan requests ile çağırın.

API, kitaplıksız çağrılabilecek kadar küçüktür. Dikkat gerektiren kısım yanıttır: POST /chat/completions her zaman bir sunucu tarafından gönderilen olay akışı döndürür ve modelin cevabı, ağ geçidi onu filtreledikten sonra tek bir olay olarak gelir; bir token beslemesi olarak değil.

Bir istemci kitaplığının gizlemesi gereken şeyler

  • Akışsız bir mod yoktur. Her sohbet çağrısı text/event-stream ile yanıt verir. stream alanı istek DTO'su tarafından kabul edilir ama hiçbir yerde okunmaz; bu nedenle response.json() başarısız olur.
  • Parçacıklar değil, tek içerik olayı. Ağ geçidi sağlayıcının çıktısını tamponlar, filtreler ve {"id":"filtered-response","content":…,"finish_reason":"stop"} olayını bir kez yayar. choices[] yoktur ve kademeli olarak yazdırılacak bir şey yoktur.
  • Politika engellemesi bir 200'dür. Reddedilen bir istem akışı bir HTTP hatasıyla değil, bir olayla sonlandırır.
  • İki sohbet yüzeyi reddetme konusunda uyuşmaz. /chat/completions bir error alanı gönderir; /sessions/:id/messages ise error alanı olmadan {"type":"content_rejected","reason":…} gönderir.
  • Her rota aynı kimlik bilgisini kabul etmez. Bir cid_key_ taşıyıcısı /chat/completions, /models ve /api/v1/guardrails/detect üzerinde çalışır. Oturumlar, görüntü analizi ve belge analizi POST /auth/login ile alınan bir kullanıcı JWT'si gerektirir.

Bugün REST API'yi kullanın

import json
import os
from typing import Any
 
import requests
 
GATEWAY = 'https://<gateway-host>'
HEADERS = {
    'Authorization': f'Bearer {os.environ["CID222_API_KEY"]}',
    'Content-Type': 'application/json',
}
 
 
class ContentBlocked(RuntimeError):
    """The prompt or the answer was refused by policy. Retrying the same text does not help."""
 
 
def chat(messages: list[dict], model: str = 'gpt-4o', provider: str | None = None) -> str:
    response = requests.post(
        f'{GATEWAY}/chat/completions',
        headers=HEADERS,
        json={'model': model, 'provider': provider, 'messages': messages},
        stream=True,
        # Detection runs before the provider call, and the answer is buffered:
        # allow a long read timeout.
        timeout=(10, 300),
    )
    response.raise_for_status()
 
    answer = ''
    for line in response.iter_lines(decode_unicode=True):
        if not line or not line.startswith('data: '):
            continue
        data = line[6:].strip()
        if data == '[DONE]':
            break
 
        event: dict[str, Any] = json.loads(data)
 
        # Prompt blocked before the provider was called, or a server-side failure.
        if 'error' in event:
            raise ContentBlocked(event['error'])
        # Answer discarded by the output filter.
        if event.get('type') == 'output_content_rejected':
            raise ContentBlocked(event.get('reason', 'response blocked'))
        # Routing, compression, token usage and warning telemetry.
        if event.get('type'):
            continue
 
        # The whole filtered answer, as one event.
        if isinstance(event.get('content'), str):
            answer = event['content']
 
    return answer
 
 
print(chat([{'role': 'user', 'content': 'Explain quantum computing in simple terms.'}]))

Metin taramak için akış işleme gerekmez — tespit uç noktası düz JSON döndürür ve kararı durum kodunda değil action alanında belirtir:

def detect(text: str, check_type: str = 'prompt') -> dict:
    response = requests.post(
        f'{GATEWAY}/api/v1/guardrails/detect',
        headers=HEADERS,
        json={'text': text, 'check_type': check_type},
        timeout=30,
    )
    response.raise_for_status()
    return response.json()
 
 
result = detect('Email me at john@example.com')
print(result['action'])      # "mask"
print(result['maskedText'])  # "Email me at [EMAIL]"

text 1–50.000 karakter olmalıdır ve detectedEntities[].value her zaman bir yer tutucu ya da [REDACTED] değeridir — uç nokta bulduğu ham PII'yi asla geri döndürmez.

Kitaplığın kapsaması planlanan şeyler

Bunlar niyettir, yayımlanmış davranış değildir. Buradaki hiçbir şey bugün çağrılabilir değildir.

  • Asenkron destek — aynı çağrılar asyncio altında, böylece bir tarama veya sohbet çağrısı bir olay döngüsünü bloklamaz.
  • Tip ipuçları — eksiksiz ek açıklamalar, böylece bir düzenleyici istek alanlarını tamamlayabilir.
  • Akış işleme — çerçeve birleştirme ve sonlandırıcı olaylar tek bir çağrının arkasında, yararlı olduğu yerde bir generator olarak sunulur.
  • Otomatik yeniden deneme — taşıma hatalarında ve 5xx yanıtlarında üstel geri çekilme; yalnızca aynı kararı üreteceği için bir politika reddinde yeniden deneme yok.
  • Pydantic modelleri — ağ geçidinin kendi alan adlarına karşı istek ve yanıt doğrulaması.

Sınırlar ve bilinen eksikler

  • Böyle bir paket yoktur. Herhangi bir genel dizinde bulacağınız bir cid222 dağıtımı bu proje tarafından yayımlanmamıştır. Kurmayın.
  • Yayın tarihi yoktur. Yukarıdaki planlanan listeyi bir taahhüt değil, bir yön olarak görün.
  • requests eşzamanlıdır. Yukarıdaki istemci çağrının tamamı boyunca bir iş parçacığını tutar; bu da modelin tüm gecikmesi artı filtreleme süresidir. Bu sizin için önemliyse aynı çerçeve işlemeyi izleyerek httpx veya aiohttp kullanın.
  • Bilinmeyen istek alanları sessizce düşürülür. Ağ geçidinin doğrulama işlem hattı bunları reddetmek yerine çıkarır; bu nedenle yanlış yazılmış bir alan adı, ayarınızı yok sayan başarılı bir çağrı üretir.
  • iter_lines düzgün biçimli çerçeveler varsayar. Ağ geçidi çerçeve başına tek bir data: satırı yaydığı için burada yeterlidir; ancak kısmi çerçevelere dayanması gereken bir istemci ham içeriği tamponlayıp boş satırdan kendisi bölmelidir.

İlgili sayfalar

Son güncelleme

Bu sayfada