# dsh-plugin-llmtr

[English](README.md) | Türkçe

[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (`dsh`) için [LLMTR](https://llmtr.com) sağlayıcı rotası.

LLMTR, OpenAI uyumlu bir yapay zekâ ağ geçidi. Tek API anahtarıyla OpenAI, Anthropic, Google, Qwen, Mistral, xAI ve diğerlerinden 170'ten fazla sohbet modeline erişilir — ayrıca istemlerin yurt içinde kalması gereken kurumlar için LLMTR'nin Türkiye'deki kendi altyapısında barındırdığı modellere.

Bu eklenti söz konusu modelleri `ctx.llm` üzerinde `llmtr` sağlayıcı rotası olarak kaydeder; böylece modeller harness model seçicisinde görünür ve diğer rotalar gibi oturum, agent ve subagent bazında seçilebilir.

## Kurulum

```sh
dsh plugin add dsh-plugin-llmtr
```

Paket bir bundle yaması içerdiği için satırı `plugin add` sizin yerinize ekler. Ardından **Ayarlar → Modeller** sayfasını açın, **LLMTR** kartını bulun, [llmtr.com](https://llmtr.com) üzerinden aldığınız anahtarı yapıştırın ve kaydedin. Anahtar `$DSH_HOME/.credentials.yaml` içinde saklanır; ayarlarda yalnızca referansı tutulur.

Model seçici kendini ağ geçidinin canlı listesinden doldurur — elle bir şey yazmanız gerekmez ve LLMTR'nin sonradan eklediği modeller sürüm yükseltmeden görünür.

### Eklenti CLI'si olmadan

Satırı kendi `cordis.yml` dosyanıza ya da bir `--patch` katmanına ekleyin:

```yaml
- insert:
    - id: llm-llmtr
      name: dsh-plugin-llmtr
```

Anahtarı saklamak yerine ortam değişkeni olarak da verebilirsiniz:

```sh
export LLMTR_API_KEY=llmtr-...
```

## Model kimlikleri

Model kimlikleri ağ geçidinin kendi `sahip/model` biçimidir ve olduğu gibi iletilir:

```
openai/gpt-5.4          anthropic/claude-...      google/gemini-3.7-flash
qwen/qwen3-8-...        mistral/...               deepseek/deepseek-v4-...
llmtr/muse-glimmer-30b-tr   llmtr/trendyol-asure-12b   llmtr/gemma-4
```

`llmtr/` ile başlayan kimlikler LLMTR'nin Türkiye'de barındırdığı modellerdir; seçici bunları "Hosted in Türkiye on LLMTR infrastructure" notuyla işaretler. Diğerleri kendi sağlayıcısına yönlendirilir ve o sağlayıcının koşullarına göre işlenir — eklenti onlar için başka bir şey iddia etmez.

## Veri yerleşimi

Yalnızca yurt içi modelleri sunmak için katalog kapsamını daraltın:

```yaml
llm-llmtr:
  catalogScope: turkey-hosted
```

Seçici başka hiçbir modeli listelemez; böylece istemleri yurt dışına çıkan bir modelle oturum başlatılamaz.

## Yapılandırma

Tüm alanlar isteğe bağlıdır ve `$DSH_HOME/settings.yaml` dosyasının `llm-llmtr` bölümünde (ya da eklenti satırının `config` alanında) yaşar. Değişiklikler yeniden başlatma olmadan bir sonraki isteğe ulaşır; sürmekte olan bir akış başladığı değerlerle devam eder.

| Alan | Varsayılan | Neyi belirler |
| --- | --- | --- |
| `apiKeyEnv` | `LLMTR_API_KEY` | Her istekte çözülen kimlik bilgisi referansı |
| `baseURL` | `https://llmtr.com/v1` | Uç nokta; güvenilir katmandan gelen `$LLMTR_BASE_URL` varsayılanı geçersiz kılar |
| `headers` | `{}` | Ek istek başlıkları; kimlik doğrulama ve atıf adları daima kazanır |
| `catalogScope` | `chat` | `chat`, `turkey-hosted` veya `all` |
| `catalogTtlMs` | `900000` | Çekilen listenin ne kadar süre yeniden kullanılacağı |
| `models` | `[]` | Sabit liste; boş değilse canlı listenin tamamının yerine geçer |
| `modelOverrides` | `{}` | Canlı listenin üzerine uygulanan model bazlı düzeltmeler |
| `reasoningEfforts` | `[]` | Ağ geçidinin modelleriniz için kabul ettiği efor kimlikleri |
| `maxTokens` | `32768` | İstek başına varsayılan çıktı üst sınırı |
| `defaultContextWindow` | `131072` | Boyutlandırmadığınız modeller için varsayılan kapasite |
| `streamIdleTimeoutMs` | `300000` | Bir akış okuması sürerken boşta kalma tavanı |
| `retryPolicy` | harness varsayılanı | Sağlayıcıya ait yeniden deneme politikası |

### Bağlam pencereleri

LLMTR listesi kimlik ve operasyonları yayınlar, kapasiteleri değil. Bu yüzden aksini söyleyene kadar her model `defaultContextWindow` ile boyutlandırılır. Gerçekten kullandıklarınızı düzeltin:

```yaml
llm-llmtr:
  modelOverrides:
    openai/gpt-5.4:
      contextWindow: 400000
    llmtr/muse-glimmer-30b-tr:
      contextWindow: 32768
      maxTokens: 8192
```

### Akıl yürütme eforu

Akıl yürütme **çıktısı** kutudan çıktığı gibi çalışır: adaptör hem `reasoning_content` hem `reasoning` deltalarını okur, dolayısıyla bir akıl yürütme modelinin düşünme adımları hiçbir ayar yapmadan transkriptte görünür.

Efor **seviyesi** seçimi ise isteğe bağlıdır, çünkü ağ geçidi istekleri `reasoning_effort` alanını akıl yürütmeyen modellerde reddeden sağlayıcılara da dağıtır. Modellerinizin kabul ettiklerini bildirin, harness tam olarak onları sunsun:

```yaml
llm-llmtr:
  reasoningEfforts: [low, medium, high]
```

Liste boşken hiçbir seçici gösterilmez ve tel üzerine hiçbir şey gitmez. Bildirilmemiş bir efor taşıyan istek sessizce düşürülmek yerine adıyla reddedilir.

### Model listesini sabitleme

Kullanıcılarının erişebileceği modelleri tam olarak sabitlemesi gereken bir kurulum, listeyi filtrelemek yerine değiştirir:

```yaml
llm-llmtr:
  models:
    - id: llmtr/muse-glimmer-30b-tr
      name: Muse Glimmer 30B
      contextWindow: 32768
    - id: llmtr/trendyol-asure-12b
```

`models` boş değilken ağ geçidi listesi hiç çekilmez.

## Kapsam

- **Yalnızca sohbet tamamlama.** İstekler akış ve kullanım raporlaması açık şekilde `/v1/chat/completions` adresine gider. LLMTR'nin gömme, görsel, video, yeniden sıralama ve gerçek zamanlı modelleri `catalogScope: all` ile listelenir ama bu adaptörle yönlendirilemez; varsayılanın `chat` olmasının nedeni budur.
- **Metin girer, metin çıkar.** Görsel içerik düzleştirilip yok sayılmak yerine, modeli adıyla belirtilerek gönderilmeden önce reddedilir.
- **Çağrı başına tek deneme.** Yeniden denemeler harness'ın yeniden deneme politikasına aittir; böylece hata adaptörün içinde gizlenmek yerine bir kez görünür olur.

## Gizlilik

Eklenti harness'ın standart `User-Agent` başlığını, bu paketi ve sürümünü belirten `x-llmtr-client` başlığını ve API anahtarınızı gönderir. Hiçbir başlığa oturum kimliği, istem metni, dosya yolu veya kullanıcı tanımlayıcısı eklenmez.

## Geliştirme

```sh
npm install
npm test          # 80 birim testi; ağ bağlantısı ve anahtar gerektirmez
npm run typecheck
npm run build
```

`tests/mock-server.ts` ağ geçidinin yerine geçer, bu yüzden test paketi çevrimdışı çalışır.

## Lisans

[MIT](LICENSE). Bazı bölümler DeepSeek Harness'tan türetilmiştir — bkz. [NOTICE](NOTICE).
