Files
OmniRoute/docs/i18n/km/docs/frameworks/PLUGIN_SDK.md
Diego Rodrigues de Sa e Souza 8feea123bb feat(docs): mirror every docs/ page in all 65 locales (#14106)
* feat(docs): mirror every docs/ page in all 65 locales

Extends the documentation mirrors from the 22-page core set (#13940) to
every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors
(6,208 new), language bars rewritten for the full locale list, state
adopted so the blocking drift gate now covers all 152 pages.

run-translation.mjs: an oversized block made only of table rows or list
items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is
cut at item boundaries and rejoined without a blank line — the single
16-40 KB request outlived the backend socket for verbose scripts. 48
older mirrors whose tables had lost rows were retranslated with --force.

* docs(i18n): refresh mirrors for the sources the base changed since the branch cut

Section-level retranslation of the 29 docs (and README.md) whose source
or mirrors moved on release/v3.8.51 during the run, then state adoption;
the drift gate is green again on the merged tree.
2026-09-18 13:16:46 -03:00

15 KiB

OmniRoute Plugin SDK (ខ្មែរ)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW


ចាប់ផ្ដើមរហ័ស

import { definePlugin } from "omniroute/plugins/sdk";

export default definePlugin({
  name: "my-plugin",
  priority: 50,
  onRequest: async (ctx) => {
    console.log(`Request ${ctx.requestId} for ${ctx.model}`);
  },
  onResponse: async (ctx, response) => {
    console.log(`Response for ${ctx.requestId}`);
    return response;
  },
  onError: async (ctx, error) => {
    console.error(`Error: ${error.message}`);
  },
});

ឯកសារយោង API

definePlugin(def: PluginDefinition): Plugin

អនុគមន៍រោងចក្រដែលបង្កើតវត្ថុ Plugin ជាមួយនឹងតម្លៃលំនាំដើម។

ប៉ារ៉ាម៉ែត្រ៖

  • name (string, ចាំបាច់) — ឈ្មោះ Plugin ជាទម្រង់ kebab-case
  • priority (number, ស្រេចចិត្ត, លំនាំដើម៖ 100) — តម្លៃទាបជាងដំណើរការមុន
  • enabled (boolean, ស្រេចចិត្ត, លំនាំដើម៖ true) — ចាប់ផ្ដើមក្នុងស្ថានភាពបើកដំណើរការឬ?
  • onRequest (function, ស្រេចចិត្ត) — ដំណើរការមុនកម្មវិធីដោះស្រាយការជជែក
  • onResponse (function, ស្រេចចិត្ត) — ដំណើរការបន្ទាប់ពីកម្មវិធីដោះស្រាយការជជែក
  • onError (function, ស្រេចចិត្ត) — ដំណើរការនៅពេលកម្មវិធីដោះស្រាយមានកំហុស

blockRequest(response?): BlockingHookResult

ទប់ស្កាត់សំណើ និងអាចត្រឡប់ការឆ្លើយតបផ្ទាល់ខ្លួនជាជម្រើស។

onRequest: (ctx) => {
  if (!ctx.headers["authorization"]) {
    return blockRequest({ error: "Unauthorized", status: 401 });
  }
};

modifyBody(body): PluginResult

កែប្រែខ្លឹមសារសំណើ មុនពេលវាទៅដល់អ្នកផ្ដល់សេវា។

onRequest: (ctx) => {
  return modifyBody({ ...ctx.body, temperature: 0.7 });
};

addMetadata(metadata): PluginResult

ភ្ជាប់ទិន្នន័យមេតាទៅនឹងបរិបទសំណើ។

onRequest: (ctx) => {
  return addMetadata({ source: "my-plugin", version: "1.0.0" });
};

បរិបទ Plugin (PluginContext)

វាល ប្រភេទ ការពិពណ៌នា
requestId string ឧបករណ៍សម្គាល់សំណើតែមួយគត់
model string ឈ្មោះម៉ូដែលដែលបានស្នើសុំ
provider string ID របស់អ្នកផ្ដល់សេវាគោលដៅ
body Record<string, unknown> ខ្លឹមសារសំណើ
headers Record<string, string> បឋមកថាសំណើ
metadata Record<string, unknown> ទិន្នន័យមេតាដែលអាចកែប្រែបាន
timestamp number ត្រាពេលវេលានៃសំណើ

Manifest (plugin.json)

{
  "name": "my-plugin",
  "version": "1.0.0",
  "description": "A sample plugin",
  "author": "your-name",
  "main": "index.js",
  "hooks": {
    "onRequest": { "enabled": true, "priority": 50 },
    "onResponse": true,
    "onError": false
  },
  "requires": {
    "permissions": ["network", "file-read"]
  },
  "enabledByDefault": false,
  "configSchema": {
    "apiKey": {
      "type": "string",
      "description": "API key for external service"
    },
    "maxRetries": { "type": "number", "min": 1, "max": 10, "default": 3 },
    "debug": { "type": "boolean", "default": false },
    "mode": { "type": "string", "enum": ["fast", "slow"], "default": "fast" }
  }
}

អាទិភាព Hook

Hook អាចត្រូវបានកំណត់រចនាសម្ព័ន្ធជាមួយនឹងអាទិភាព (តម្លៃទាបជាង = ដំណើរការមុន)៖

{
  "hooks": {
    "onRequest": { "enabled": true, "priority": 10 },
    "onResponse": { "enabled": true, "priority": 100 }
  }
}

ឬជាតម្លៃ boolean ធម្មតា (អាទិភាពលំនាំដើម 100)៖

{
  "hooks": {
    "onRequest": true,
    "onResponse": true
  }
}

ប្រព័ន្ធសិទ្ធិ

កម្មវិធីជំនួយដំណើរការក្នុងបរិបទ VM ដែលមានការការពារដាច់ដោយឡែក។ ការចូលប្រើធនធានខាងក្រៅតម្រូវឱ្យមានសិទ្ធិច្បាស់លាស់៖

សិទ្ធិ ផ្តល់សិទ្ធិឱ្យ
network fetch, AbortController, Headers, Request, Response
file-read fs.readFile, fs.readdir, fs.stat
file-write fs.writeFile, fs.mkdir, fs.rm
env ប្រូកស៊ី process.env ដែលអាចបានតែអាន
exec child_process.exec, child_process.execSync

បើគ្មានសិទ្ធិទេ globals ដែលត្រូវគ្នានឹងមិនមាននៅក្នុង sandbox ឡើយ។

គ្រោងការកំណត់រចនាសម្ព័ន្ធ

កំណត់ការកំណត់ដែលអាចកែប្រែបានក្នុង configSchema

{
  "configSchema": {
    "apiKey": { "type": "string", "description": "សោ API ខាងក្រៅ" },
    "maxRetries": { "type": "number", "min": 1, "max": 10, "default": 3 },
    "debug": { "type": "boolean", "default": false },
    "mode": { "type": "string", "enum": ["fast", "slow"], "default": "fast" }
  }
}

ប្រភេទវាល៖ string, number, boolean, select

ជម្រើសវាល៖ default, min, max, enum, description

តម្លៃកំណត់រចនាសម្ព័ន្ធត្រូវបានរក្សាទុកក្នុងមូលដ្ឋានទិន្នន័យ និងអាចចូលប្រើបានតាមរយៈទំព័រកំណត់រចនាសម្ព័ន្ធនៃផ្ទាំងគ្រប់គ្រង។

ព្រឹត្តិការណ៍ដែលមានស្រាប់

ព្រឹត្តិការណ៍ ពេលកើតឡើង ទិន្នន័យភ្ជាប់
onRequest មុនកម្មវិធីដោះស្រាយការជជែក បរិបទសំណើ
onResponse បន្ទាប់ពីកម្មវិធីដោះស្រាយការជជែក ទិន្នន័យឆ្លើយតប
onError នៅពេលមានកំហុសក្នុងកម្មវិធីដោះស្រាយ វត្ថុកំហុស
onModelSelect ម៉ូដែលត្រូវបានជ្រើសរើសសម្រាប់ការបញ្ជូនផ្លូវ ព័ត៌មានម៉ូដែល
onComboResolve ការបញ្ជូនផ្លូវបែបបន្សំត្រូវបានដោះស្រាយ គោលដៅបែបបន្សំ
onRateLimit ឈានដល់ដែនកំណត់អត្រា ព័ត៌មានអំពីដែនកំណត់
onQuotaExhaust កូតាត្រូវបានប្រើអស់ ព័ត៌មានអំពីកូតា
onProviderError អ្នកផ្តល់សេវាបានបញ្ជូនកំហុសត្រឡប់មកវិញ សេចក្ដីលម្អិតអំពីកំហុស
onStreamStart ស្ទ្រីម SSE បានចាប់ផ្ដើម ព័ត៌មានអំពីស្ទ្រីម
onStreamEnd ស្ទ្រីម SSE បានបញ្ចប់ ស្ថិតិស្ទ្រីម
onInstall កម្មវិធីជំនួយត្រូវបានដំឡើង { name, version, manifest }
onActivate កម្មវិធីជំនួយត្រូវបានធ្វើឱ្យសកម្ម { name, version, manifest }
onDeactivate កម្មវិធីជំនួយត្រូវបានធ្វើឱ្យអសកម្ម { name, version, manifest }
onUninstall កម្មវិធីជំនួយត្រូវបានលុបចេញ (មុនពេលឯកសារត្រូវបានលុប) { name, version, manifest }

ឧទាហរណ៍

កម្មវិធីកត់ត្រាសំណើ

import { definePlugin } from "omniroute/plugins/sdk";

export default definePlugin({
  name: "request-logger",
  onRequest: async (ctx) => {
    console.log(`[${new Date().toISOString()}] ${ctx.method} ${ctx.model} -> ${ctx.provider}`);
  },
});

កម្មវិធីកំណត់អត្រា

import { definePlugin, blockRequest } from "omniroute/plugins/sdk";

const requests = new Map<string, number[]>();

export default definePlugin({
  name: "rate-limiter",
  priority: 10,
  onRequest: async (ctx) => {
    const key = ctx.headers["x-api-key"] || "anonymous";
    const now = Date.now();
    const window = 60000; // 1 នាទី
    const maxRequests = 100;

    const timestamps = (requests.get(key) || []).filter((t) => t > now - window);
    timestamps.push(now);
    requests.set(key, timestamps);

    if (timestamps.length > maxRequests) {
      return blockRequest({ error: "Rate limit exceeded", status: 429 });
    }
  },
});

កម្មវិធីបម្លែងការឆ្លើយតប

import { definePlugin } from "omniroute/plugins/sdk";

export default definePlugin({
  name: "response-transformer",
  onResponse: async (ctx, response) => {
    if (response.choices) {
      response.choices = response.choices.map((c: any) => ({
        ...c,
        message: { ...c.message, content: c.message.content.trim() },
      }));
    }
    return response;
  },
});