{"id":500455,"date":"2026-10-27T11:31:02","date_gmt":"2026-10-27T08:31:02","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=500455"},"modified":"2026-10-27T11:31:02","modified_gmt":"2026-10-27T08:31:02","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=500455","title":{"rendered":"Keystone 1.0: LLM-\u0448\u043b\u044e\u0437, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u0442 \u043c\u043e\u0434\u0435\u043b\u0438, \u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0432\u043e\u0438 GPU \u0438 \u043d\u0435 \u0442\u0435\u0440\u044f\u0435\u0442 \u043a\u043b\u044e\u0447\u0438"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/d1\/47\/d9\/d147d90fc5d7d72288dc029525965c0d.png\" alt=\"\u0414\u0435\u0432\u0443\u0448\u043a\u0430, \u043c\u0438\u043b\u0430\u044f, \u043c\u043d\u0435 gemini 3.8 flash, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430!\" title=\"\u0414\u0435\u0432\u0443\u0448\u043a\u0430, \u043c\u0438\u043b\u0430\u044f, \u043c\u043d\u0435 gemini 3.8 flash, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430!\" width=\"2752\" height=\"1536\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/d1\/47\/d9\/d147d90fc5d7d72288dc029525965c0d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/d1\/47\/d9\/d147d90fc5d7d72288dc029525965c0d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0435\u0432\u0443\u0448\u043a\u0430, \u043c\u0438\u043b\u0430\u044f, \u043c\u043d\u0435 gemini 3.8 flash, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430!<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u0418\u043c\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0430\u0435\u0442 \u0432 \u0434\u0435\u043d\u044c \u0432\u044b\u0445\u043e\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438.<\/strong> \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0432\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u0442\u0435 \u0435\u0433\u043e \u0434\u0435\u0441\u044f\u0442\u044c \u0440\u0430\u0437 \u0438 \u0434\u0435\u0441\u044f\u0442\u044c \u0440\u0430\u0437 \u0440\u0430\u0437\u043d\u0435\u0441\u0451\u0442\u0435 \u043f\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c \u043a\u043b\u044e\u0447\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432.<\/p>\n<p><strong>Keystone. The Model Switchboard. (KTMS)<\/strong> \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u0442\u043e \u0438\u0437 \u043a\u043e\u0434\u0430. \u0421\u0435\u0440\u0432\u0438\u0441 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430, \u0430 \u0448\u043b\u044e\u0437 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u0430\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0437\u0432\u0430\u0442\u044c, \u0441 \u043a\u0430\u043a\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0438 \u043d\u0435 \u043e\u0442\u0434\u0430\u0442\u044c \u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u0430\u0448\u0435\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 GPU. \u0412 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 7 \u041c\u0438\u0411 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 1.0 \u0435\u0433\u043e API \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 1.x \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u0435 \u0441\u043e <a href=\"http:\/\/github.com\/ai-process\/ktms\" rel=\"noopener nofollow\">\u0448\u043b\u044e\u0437\u043e\u043c<\/a> 1.0 \u0432\u044b\u0448\u043b\u0438 \u0432\u0435\u0431-\u043a\u043e\u043d\u0441\u043e\u043b\u044c <strong>ktms-admin<\/strong> \u0438 \u0443\u0447\u0451\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 <strong>light-tokenmeter<\/strong>, \u0432\u0441\u0435 \u0442\u0440\u0438 \u043d\u0430 Go \u0438 \u043f\u043e\u0434 Apache 2.0. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0438\u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 1.3.<\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Keystone \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u0443<\/h3>\n<p>Keystone \u2014 self-hosted \u0448\u043b\u044e\u0437 \u043c\u0435\u0436\u0434\u0443 \u0432\u0430\u0448\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0438 LLM-\u0432\u0435\u043d\u0434\u043e\u0440\u0430\u043c\u0438. \u0421\u0435\u0440\u0432\u0438\u0441\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043a \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435, \u0430 KTMS:<\/p>\n<ul>\n<li>\n<p>\u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u043b\u044e\u0447\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432 \u0432 Postgres, \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 AES-256-GCM, \u0438 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c, \u0430 \u043d\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0432 \u043a\u043e\u0434\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u0435\u0441\u043b\u0438 \u0432\u0435\u043d\u0434\u043e\u0440 \u043b\u0435\u0436\u0438\u0442 \u0438\u043b\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0442\u043e\u043a\u0435\u043d\u044b \u0438 \u0434\u0435\u043d\u044c\u0433\u0438 \u043d\u0430 \u043a\u043b\u044e\u0447, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043e \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 \u0443\u0447\u0451\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<pre><code> \u0432\u0430\u0448\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u2500\u2500gRPC \/ HTTP \/v1\u2500\u2500\u25b6 Keystone \u2500\u2500\u25b6 OpenAI \/ Anthropic \/ Gemini \/ DeepSeek \/ Bedrock \/ ...                                     \u2502   \u2502  \u2514\u2500\u2500\u25b6 \u0432\u0430\u0448\u0438 GPU-\u043d\u043e\u0434\u044b (Ollama, vLLM, TGI, llama.cpp)                            Postgres \u2518   \u2514 Redis (\u043b\u0438\u043c\u0438\u0442\u044b, \u043a\u044d\u0448)       \u2514\u2500\u2500\u25b6 light-tokenmeter (\u0443\u0447\u0451\u0442)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/15\/05\/27\/15052758b022826b606e8523177d71fa.png\" alt=\"\u041d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u043e\u0432 \u0441\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430\u043c\u0438\" title=\"\u041d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u043e\u0432 \u0441\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430\u043c\u0438\" width=\"2048\" height=\"1320\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/15\/05\/27\/15052758b022826b606e8523177d71fa.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/15\/05\/27\/15052758b022826b606e8523177d71fa.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u043e\u0432 \u0441\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430\u043c\u0438<\/figcaption><\/div>\n<\/figure>\n<div class=\"floating-image\">\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043f\u0438\u0448\u0435\u0442 <code>gpt-4o<\/code>. \u041e\u043d \u043f\u0440\u043e\u0441\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c: <code>LOW<\/code>, <code>MEDIUM<\/code> \u0438\u043b\u0438 <code>HIGH<\/code>, \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b (<code>language<\/code>, <code>task<\/code>, <code>user_id<\/code>). \u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0430\u0432\u0438\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u043e \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0441 \u0444\u043e\u043b\u0431\u044d\u043a\u0430\u043c\u0438:<\/p>\n<\/div>\n<pre><code class=\"bash\">grpcurl -plaintext -H \"authorization: Bearer $ADMIN_KEY\" -d '{\"rules\":[  {\"name\":\"spanish-high\", \"priority\":30, \"effort\":\"EFFORT_HIGH\",   \"attributes\":{\"language\":\"es\"}, \"use\":[\"gemini-2.5-pro\",\"gpt-4o\"], \"enabled\":true},  {\"name\":\"low-default\", \"priority\":20, \"effort\":\"EFFORT_LOW\",   \"use\":[\"deepseek-chat\",\"gpt-4o-mini\"], \"enabled\":true},  {\"name\":\"anything-else\", \"priority\":1, \"use\":[\"gpt-4o-mini\"], \"enabled\":true}]}' localhost:9090 ktms.v1.AdminService\/ReplaceRules<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443, \u0431\u0435\u0437 \u0440\u0435\u043b\u0438\u0437\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0412\u044b\u0448\u043b\u0430 \u043d\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u2014 \u043f\u0440\u0430\u0432\u0438\u0442\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0430 \u043d\u0435 \u0441\u043e\u0440\u043e\u043a \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<h4>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430<\/h4>\n<p>\u0415\u0441\u0442\u044c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 gRPC (<code>ktms.v1<\/code>) \u0438 OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 HTTP. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043d\u0430 OpenAI SDK \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043c\u0435\u043d\u043e\u0439 <code>base_url<\/code>:<\/p>\n<pre><code class=\"python\">from openai import OpenAIclient = OpenAI(base_url=\"http:\/\/localhost:8080\/v1\", api_key=\"ktms_&lt;\u0432\u0430\u0448 \u043a\u043b\u044e\u0447&gt;\")reply = client.chat.completions.create(    model=\"auto\",    messages=[{\"role\": \"user\", \"content\": \"Say hi in three words.\"}],)print(reply.choices[0].message.content, reply.model)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412 \u043e\u0442\u0432\u0435\u0442\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 <code>X-KTMS-Vendor<\/code>, <code>X-KTMS-Rule<\/code> \u0438 <code>X-KTMS-Placement<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u043a\u0442\u043e \u0438 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \u043e\u0442\u0432\u0435\u0442\u0438\u043b.<\/p>\n<h4>\u0427\u0442\u043e \u0443\u043c\u0435\u0435\u0442 (\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 1.3)<\/h4>\n<ul>\n<li>\n<p><strong>\u041c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f:<\/strong> effort LOW\/MEDIUM\/HIGH \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443, \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0444\u043e\u043b\u0431\u044d\u043a\u043e\u0432, <code>model: \"auto\"<\/code> \u0441 \u0441\u0443\u0434\u044c\u0451\u0439 (250 \u043c\u0441, \u043e\u0442\u043a\u0430\u0442 \u043d\u0430 MEDIUM), \u043a\u0430\u043d\u0430\u0440\u0435\u0439\u043a\u0438 \u0441 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439 \u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, shadow-\u0442\u0440\u0430\u0444\u0438\u043a \u0441 \u043e\u0446\u0435\u043d\u043a\u043e\u0439, \u0441\u0443\u0445\u043e\u0439 \u043f\u0440\u043e\u0433\u043e\u043d <code>ktms route explain<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c:<\/strong> circuit breaker, \u043f\u0430\u0443\u0437\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e <code>Retry-After<\/code>, \u043e\u0434\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u2014 \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0435 Postgres \u0438 Redis.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0435\u043d\u044c\u0433\u0438 \u0438 \u043b\u0438\u043c\u0438\u0442\u044b:<\/strong> RPM\/TPM \u0438 allowlist \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0430 \u043a\u043b\u044e\u0447, \u0434\u043d\u0435\u0432\u043d\u044b\u0435 \u0438 \u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0435 \u043b\u0438\u043c\u0438\u0442\u044b \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u043d\u0430 \u043a\u043b\u044e\u0447, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e, \u0446\u0435\u043d\u044b prompt cache, Batch API \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0432\u043e\u0438 GPU:<\/strong> \u0430\u0433\u0435\u043d\u0442 \u043d\u043e\u0434\u044b \u0434\u043b\u044f Ollama, vLLM, TGI \u0438 llama.cpp, \u0434\u043e\u043f\u0443\u0441\u043a \u043f\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, placement \u00ab\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0438 \u043d\u043e\u0434\u044b\u00bb, \u0443\u0440\u043e\u0432\u043d\u0438 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b <code>ktms-node stats<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c:<\/strong> \u043a\u043b\u044e\u0447\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432 \u0432 Postgres \u043f\u043e\u0434 AES-256-GCM \u0438 \u0438\u0445 \u0440\u043e\u0442\u0430\u0446\u0438\u044f, \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 PII, \u0434\u0435\u0442\u0435\u043a\u0446\u0438\u044f prompt injection, \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u0435 guardrails \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u044d\u0448 (\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e).<\/p>\n<\/li>\n<li>\n<p><strong>API:<\/strong> gRPC <code>ktms.v1<\/code> \u0438 OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 HTTP, \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433, tool calling, JSON Schema \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c, embeddings, TTS, \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, Judge.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435:<\/strong> CLI <code>ktms<\/code> \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438 \u0438 <code>ktms init<\/code>, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432 YAML (<code>plan<\/code>\/<code>apply<\/code>), MCP-\u0441\u0435\u0440\u0432\u0435\u0440 <code>ktms mcp<\/code> \u0434\u043b\u044f \u0418\u0418-\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043e\u0432, \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f Claude Code, scope <code>admin:read<\/code>, \u0432\u0435\u0431-\u043a\u043e\u043d\u0441\u043e\u043b\u044c ktms-admin.<\/p>\n<\/li>\n<li>\n<p><strong>\u042d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f:<\/strong> \u043c\u0435\u0442\u0440\u0438\u043a\u0438 <code>ktms_*<\/code> \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0430\u043b\u0435\u0440\u0442\u0430\u043c\u0438, Helm-\u0447\u0430\u0440\u0442 \u0432 OCI, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u0441 SBOM \u0438 SLSA, \u0442\u0435\u0441\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c PR.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c<\/h3>\n<p>Keystone \u2014 \u043e\u0434\u0438\u043d Go-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430. \u041d\u0430 \u0441\u0442\u0435\u043d\u0434\u0435 \u0438\u0437 11 \u0448\u043b\u044e\u0437\u043e\u0432 (Google Cloud <code>c3-standard-4<\/code>, 4 vCPU, mock-\u0430\u043f\u0441\u0442\u0440\u0438\u043c, \u0434\u0432\u0430 \u043f\u0440\u043e\u0433\u043e\u043d\u0430):<\/p>\n<ul>\n<li>\n<p>~7 \u041c\u0438\u0411 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 ~20 \u041c\u0438\u0411 \u043f\u0440\u0438 200 RPS (Postgres \u0438 Redis \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f);<\/p>\n<\/li>\n<li>\n<p>~0,64 \u043c\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0430 p50 \u0438 ~1,1 \u043c\u0441 \u043d\u0430 p99;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 4000 RPS \u043d\u0430 4 vCPU \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a;<\/p>\n<\/li>\n<li>\n<p>~170 \u043c\u0441 \u043e\u0442 <code>docker start<\/code> \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0440\u0430\u0437 ~21 \u041c\u0411 \u043d\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u043d\u0435 \u0441\u0430\u043c\u044b\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0435: agentgateway, Apache APISIX \u0438 Kong \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u0442\u0440\u0430\u0442\u044f\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 CPU \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441. \u0417\u0430\u0442\u043e \u043f\u043e \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438, \u0441\u0442\u0430\u0440\u0442\u0430 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Keystone \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/ae\/42\/d1\/ae42d1e452fadc15e8abcc2f6d9b75f8.png\" alt=\"\" title=\"\" width=\"1520\" height=\"784\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/ae\/42\/d1\/ae42d1e452fadc15e8abcc2f6d9b75f8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/ae\/42\/d1\/ae42d1e452fadc15e8abcc2f6d9b75f8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 p50 \u0443 \u0448\u043b\u044e\u0437\u043e\u0432 \u0441\u0442\u0435\u043d\u0434\u0430<\/figcaption><\/div>\n<\/figure>\n<h3>\u0427\u0442\u043e \u0432\u043e\u0448\u043b\u043e \u0432 \u0440\u0435\u043b\u0438\u0437<\/h3>\n<p>\u0427\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u043f\u0443\u0442\u0438 \u043e\u0442 0.13 \u043a 1.0.<\/p>\n<p><strong>\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/strong> \u041a\u043b\u044e\u0447\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0423 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u0432\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438 \u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0439 \u0431\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u0432\u0441\u0435 \u0435\u0451 \u043a\u043b\u044e\u0447\u0438. <code>ListModels<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0451 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p><strong>\u041d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432.<\/strong> \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0442\u0440\u0430\u0438 SDK \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0434\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u2014 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 \u0432\u0435\u043d\u0434\u043e\u0440\u0430. \u0428\u043b\u044e\u0437 \u0447\u0438\u0442\u0430\u0435\u0442 <code>Retry-After<\/code> (\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438 \u0443 Gemini) \u0438 \u0441\u0442\u0430\u0432\u0438\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0432\u0435\u043d\u0434\u043e\u0440\u0430, \u0430 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0438\u0434\u0451\u0442 \u0434\u0430\u043b\u044c\u0448\u0435. \u041f\u043b\u044e\u0441 circuit breaker \u043d\u0430 \u043f\u0430\u0440\u0443 (\u0432\u0435\u043d\u0434\u043e\u0440, \u043c\u043e\u0434\u0435\u043b\u044c).<\/p>\n<p><strong>\u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/strong> \u041e\u043f\u0438\u0441\u0430\u043d\u043e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f. \u041f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0435 Postgres \u043a\u043b\u044e\u0447\u0438, \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 5 \u043c\u0438\u043d\u0443\u0442, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0434\u0451\u0442 \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043d\u0438\u043c\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0435 Redis \u043b\u0438\u043c\u0438\u0442\u044b \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u0442\u0440\u0430\u0444\u0438\u043a (\u0434\u043b\u044f \u0434\u0435\u043d\u0435\u0433 \u0440\u0435\u0436\u0438\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e). \u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0443\u0447\u0451\u0442\u0430 \u043a\u043e\u043f\u044f\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<p><strong>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c.<\/strong> JSON Schema \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u0435\u043d\u0434\u043e\u0440\u0430\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <code>enum<\/code>, <code>format<\/code>, <code>nullable<\/code> \u0438 <code>additionalProperties<\/code>. \u0415\u0441\u043b\u0438 \u0432\u0435\u043d\u0434\u043e\u0440 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434, \u0448\u043b\u044e\u0437 \u0441\u0430\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0432\u0435\u0442, \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p><strong>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u043e\u0434\u044b \u043f\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/strong> \u0410\u0433\u0435\u043d\u0442 \u043d\u043e\u0434\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0434\u0432\u0438\u0436\u043a\u0430 (vLLM, TGI, llama.cpp), \u0438 \u0448\u043b\u044e\u0437 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043d\u043e\u0434\u0443, \u0433\u0434\u0435 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0434\u043e\u043b\u044c\u0448\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e.<\/p>\n<p><strong>\u0420\u043e\u0442\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/strong> \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430: \u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0448\u0438\u0444\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u043a\u043b\u044e\u0447\u0430, <code>RotateEncryption<\/code> \u043f\u0435\u0440\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u043a\u043b\u044e\u0447\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432 \u0438 \u0442\u043e\u043a\u0435\u043d\u044b \u043d\u043e\u0434 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 Postgres \u0432 CI.<\/p>\n<p><strong>\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u043b\u0438\u0437\u044b.<\/strong> \u041e\u0431\u0440\u0430\u0437\u044b \u0438 <code>checksums.txt<\/code> \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b cosign \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 keyless, \u0443 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0435\u0441\u0442\u044c SBOM \u0438 SLSA-provenance, \u0443 \u0430\u0440\u0445\u0438\u0432\u043e\u0432 SPDX SBOM. <code>govulncheck<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c pull request.<\/p>\n<p><strong>\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f Apache 2.0<\/strong> \u0432\u043c\u0435\u0441\u0442\u043e MIT: \u044f\u0432\u043d\u0430\u044f \u043f\u0430\u0442\u0435\u043d\u0442\u043d\u0430\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0448\u043b\u044e\u0437 \u0432 \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b.<\/p>\n<blockquote>\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u044f\u044f \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u0430 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 Python-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430\u043f\u043e\u043c\u043d\u0438\u043b\u0430, \u0447\u0442\u043e \u0448\u043b\u044e\u0437 \u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u043b\u044e\u0447\u0438 \u043a\u043e \u0432\u0441\u0435\u043c \u0432\u0435\u043d\u0434\u043e\u0440\u0430\u043c \u0441\u0440\u0430\u0437\u0443. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0442\u043e\u0433\u043e \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u0430 \u0438 \u0447\u0442\u043e \u0438\u0437 \u043d\u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u2014 \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/1099402\/\" rel=\"noopener nofollow\">\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>.<\/p>\n<\/blockquote>\n<h3>\u0414\u0432\u0430 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h3>\n<p><strong>ktms-admin<\/strong> \u2014 \u0432\u0435\u0431-\u043a\u043e\u043d\u0441\u043e\u043b\u044c: \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u043a\u043b\u044e\u0447\u0438, \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432 \u0438 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 \u0432\u0430\u0448\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0412\u0445\u043e\u0434 \u043f\u043e \u043f\u0430\u0440\u043e\u043b\u044e, \u0447\u0435\u0440\u0435\u0437 Google \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 OpenID Connect, GitHub \u0438\u043b\u0438 \u0432\u0430\u0448 access-\u043f\u0440\u043e\u043a\u0441\u0438 (oauth2-proxy, Authelia, Authentik, Pomerium, Cloudflare Access) \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432. \u041e\u0434\u0438\u043d \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0441\u0442\u0440\u043e\u0435\u043d, \u0441\u0431\u043e\u0440\u043a\u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430 \u043d\u0435\u0442.<\/p>\n<p><strong>light-tokenmeter<\/strong> \u2014 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043a\u0442\u043e \u0442\u0440\u0430\u0442\u0438\u0442 \u0442\u043e\u043a\u0435\u043d\u044b \u0438 \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u043e\u043d\u043e \u0442\u043e\u0433\u043e\u00bb. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u0432\u043e\u0434\u043a\u0438 \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c, \u0432\u0435\u043d\u0434\u043e\u0440\u0430\u043c \u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c. \u041a\u043e\u043d\u0441\u043e\u043b\u044c \u043f\u043e \u044d\u0442\u0438\u043c \u0441\u0432\u043e\u0434\u043a\u0430\u043c \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u044b \u043a\u0430\u043a <code>greedy<\/code> \u0438\u043b\u0438 <code>worthy<\/code>. \u041e\u0434\u0438\u043d \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u043e\u0434\u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 Postgres, ClickHouse \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/fc\/57\/2a\/fc572accee4527d171c00791318dadaf.png\" alt=\"\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 ktms-admin \u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u0432 light-tokenmeter\" title=\"\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 ktms-admin \u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u0432 light-tokenmeter\" width=\"2752\" height=\"1536\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/fc\/57\/2a\/fc572accee4527d171c00791318dadaf.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/fc\/57\/2a\/fc572accee4527d171c00791318dadaf.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 ktms-admin \u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u0432 light-tokenmeter<\/figcaption><\/div>\n<\/figure>\n<h3>\u041a\u0430\u043a \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c<\/h3>\n<pre><code class=\"bash\">git clone https:\/\/github.com\/ai-process\/ktms.git &amp;&amp; cd ktmsOPENAI_API_KEY=sk-... docker compose up -d --buildcurl -s http:\/\/localhost:8080\/v1\/chat\/completions \\  -H \"Authorization: Bearer ktms_dev_default_key\" -H \"Content-Type: application\/json\" \\  -d '{\"model\":\"auto\",\"messages\":[{\"role\":\"user\",\"content\":\"Say hi in three words.\"}]}'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>Compose \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 Postgres, Redis \u0438 \u0448\u043b\u044e\u0437 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438, \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 \u0438 \u043a\u043b\u044e\u0447\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<h3>\u0427\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 1.0<\/h3>\n<p>\u0414\u043e 1.0 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043e\u0431\u0435\u0449\u0430\u043b\u0438. \u0421 1.0 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 1.x \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 1.x<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">gRPC <code>ktms.v1<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">RPC, \u043f\u043e\u043b\u044f, enum \u0438 \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u043b\u0435\u0439. <code>buf breaking<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 pull request<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">HTTP <code>\/v1<\/code> \u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 <code>X-KTMS-*<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0443\u0442\u0438, \u043f\u043e\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u0438\u043c\u0435\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043c\u0435\u043d\u0430, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u0441\u043c\u044b\u0441\u043b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041b\u044e\u0431\u043e\u0439 1.x \u0441\u0430\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0431\u0430\u0437\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e, \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0433\u043e SQL<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041c\u0435\u0442\u0440\u0438\u043a\u0438 <code>ktms_*<\/code>, \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>usage.v1<\/code>, \u0430\u0433\u0435\u043d\u0442 \u043d\u043e\u0434\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043c\u0435\u043d\u0430, \u043c\u0435\u0442\u043a\u0438, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u043e\u0434\u044b \u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u043e\u0448\u0438\u0431\u043e\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043c\u044b\u0441\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f, \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0427\u0442\u043e \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043c\u0438\u043d\u043e\u0440\u043d\u043e\u043c \u0440\u0435\u043b\u0438\u0437\u0435: \u0432\u044b\u0431\u043e\u0440 effort \u0441\u0443\u0434\u044c\u0451\u0439, shadow-\u0442\u0440\u0430\u0444\u0438\u043a, \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u044d\u0448 \u0438 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u0435 guardrails, <code>JudgeStream<\/code> \u0438 <code>EvaluateRollouts<\/code>, \u0444\u043e\u0440\u043c\u0430\u0442 YAML-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>ktms<\/code> \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code>v1<\/code>. \u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u2014 \u0432 README, \u0430 \u0432 proto \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u044b \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c <code>Experimental:<\/code>.<\/p>\n<p>\u041e\u0431\u0435\u0449\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c pull request \u0438 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c \u0442\u0435\u0441\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u0430\u0437\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430 \u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430 \u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0436\u043e\u0440\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043c\u0438\u0433\u0440\u0438\u0440\u0443\u0435\u0442 \u0435\u0451 \u043d\u043e\u0432\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0430 \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435. \u0422\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435, \u0438 rolling-\u0434\u0435\u043f\u043b\u043e\u0439. \u0420\u0435\u043b\u0438\u0437 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0438 <code>buf breaking<\/code>.<\/p>\n<h3>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 1.0 \u0432 \u043f\u043b\u0430\u043d\u0430\u0445: \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0432\u043e\u0438 \u043d\u043e\u0434\u044b, hedged-\u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0432\u0442\u043e\u0440 \u0434\u043b\u044f JSON, Grafana-\u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0438 \u0440\u0435\u0446\u0435\u043f\u0442\u044b \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u041d\u0438\u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 API 1.x<\/p>\n<ul>\n<li>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439: <a href=\"http:\/\/github.com\/ai-process\/ktms\" rel=\"noopener nofollow\">github.com\/ai-process\/ktms<\/a><\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: <a href=\"http:\/\/ai-process.dev\" rel=\"noopener nofollow\">ai-process.dev<\/a><\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043d\u0441\u043e\u043b\u044c: <a href=\"http:\/\/github.com\/ai-process\/ktms-admin\" rel=\"noopener nofollow\">github.com\/ai-process\/ktms-admin<\/a><\/p>\n<\/li>\n<li>\n<p>\u0423\u0447\u0451\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432: <a href=\"http:\/\/github.com\/ai-process\/light-tokenmeter\" rel=\"noopener nofollow\">github.com\/ai-process\/light-tokenmeter<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u043c.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1099790\/\">https:\/\/habr.com\/ru\/articles\/1099790\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0414\u0435\u0432\u0443\u0448\u043a\u0430, \u043c\u0438\u043b\u0430\u044f, \u043c\u043d\u0435 gemini 3.8 flash, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430!\u0418\u043c\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0430\u0435\u0442 \u0432 \u0434\u0435\u043d\u044c \u0432\u044b\u0445\u043e\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0432\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u0442\u0435 \u0435\u0433\u043e \u0434\u0435\u0441\u044f\u0442\u044c \u0440\u0430\u0437 \u0438 \u0434\u0435\u0441\u044f\u0442\u044c \u0440\u0430\u0437 \u0440\u0430\u0437\u043d\u0435\u0441\u0451\u0442\u0435 \u043f\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c \u043a\u043b\u044e\u0447\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432.Keystone. The Model Switchboard. (KTMS) \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u0442\u043e \u0438\u0437 \u043a\u043e\u0434\u0430. \u0421\u0435\u0440\u0432\u0438\u0441 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430, \u0430 \u0448\u043b\u044e\u0437 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u0430\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0437\u0432\u0430\u0442\u044c, \u0441 \u043a\u0430\u043a\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0438 \u043d\u0435 \u043e\u0442\u0434\u0430\u0442\u044c \u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u0430\u0448\u0435\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 GPU. \u0412 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 7 \u041c\u0438\u0411 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 1.0 \u0435\u0433\u043e API \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 1.x \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f.\u0412\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0448\u043b\u044e\u0437\u043e\u043c 1.0 \u0432\u044b\u0448\u043b\u0438 \u0432\u0435\u0431-\u043a\u043e\u043d\u0441\u043e\u043b\u044c ktms-admin \u0438 \u0443\u0447\u0451\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 light-tokenmeter, \u0432\u0441\u0435 \u0442\u0440\u0438 \u043d\u0430 Go \u0438 \u043f\u043e\u0434 Apache 2.0. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0438\u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 1.3.\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Keystone \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u0443Keystone \u2014 self-hosted \u0448\u043b\u044e\u0437 \u043c\u0435\u0436\u0434\u0443 \u0432\u0430\u0448\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0438 LLM-\u0432\u0435\u043d\u0434\u043e\u0440\u0430\u043c\u0438. \u0421\u0435\u0440\u0432\u0438\u0441\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043a \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435, \u0430 KTMS:\u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u043b\u044e\u0447\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432 \u0432 Postgres, \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 AES-256-GCM, \u0438 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c;\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c, \u0430 \u043d\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0432 \u043a\u043e\u0434\u0435;\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u0435\u0441\u043b\u0438 \u0432\u0435\u043d\u0434\u043e\u0440 \u043b\u0435\u0436\u0438\u0442 \u0438\u043b\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b;\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0442\u043e\u043a\u0435\u043d\u044b \u0438 \u0434\u0435\u043d\u044c\u0433\u0438 \u043d\u0430 \u043a\u043b\u044e\u0447, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443;\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043e \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 \u0443\u0447\u0451\u0442\u0430. \u0432\u0430\u0448\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u2500\u2500gRPC \/ HTTP \/v1\u2500\u2500\u25b6 Keystone \u2500\u2500\u25b6 OpenAI \/ Anthropic \/ Gemini \/ DeepSeek \/ Bedrock \/ &#8230;                                     \u2502   \u2502  \u2514\u2500\u2500\u25b6 \u0432\u0430\u0448\u0438 GPU-\u043d\u043e\u0434\u044b (Ollama, vLLM, TGI, llama.cpp)                            Postgres \u2518   \u2514 Redis (\u043b\u0438\u043c\u0438\u0442\u044b, \u043a\u044d\u0448)       \u2514\u2500\u2500\u25b6 light-tokenmeter (\u0443\u0447\u0451\u0442)\u041d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u043e\u0432 \u0441\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430\u043c\u0438\u0421\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043f\u0438\u0448\u0435\u0442 gpt-4o. \u041e\u043d \u043f\u0440\u043e\u0441\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c: LOW, MEDIUM \u0438\u043b\u0438 HIGH, \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b (language, task, user_id). \u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0430\u0432\u0438\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u043e \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0441 \u0444\u043e\u043b\u0431\u044d\u043a\u0430\u043c\u0438:grpcurl -plaintext -H &#171;authorization: Bearer $ADMIN_KEY&#187; -d &#8216;{&#171;rules&#187;:[  {&#171;name&#187;:&#187;spanish-high&#187;, &#171;priority&#187;:30, &#171;effort&#187;:&#187;EFFORT_HIGH&#187;,   &#171;attributes&#187;:{&#171;language&#187;:&#187;es&#187;}, &#171;use&#187;:[&#171;gemini-2.5-pro&#187;,&#187;gpt-4o&#187;], &#171;enabled&#187;:true},  {&#171;name&#187;:&#187;low-default&#187;, &#171;priority&#187;:20, &#171;effort&#187;:&#187;EFFORT_LOW&#187;,   &#171;use&#187;:[&#171;deepseek-chat&#187;,&#187;gpt-4o-mini&#187;], &#171;enabled&#187;:true},  {&#171;name&#187;:&#187;anything-else&#187;, &#171;priority&#187;:1, &#171;use&#187;:[&#171;gpt-4o-mini&#187;], &#171;enabled&#187;:true}]}&#8217; localhost:9090 ktms.v1.AdminService\/ReplaceRules\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443, \u0431\u0435\u0437 \u0440\u0435\u043b\u0438\u0437\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0412\u044b\u0448\u043b\u0430 \u043d\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u2014 \u043f\u0440\u0430\u0432\u0438\u0442\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0430 \u043d\u0435 \u0441\u043e\u0440\u043e\u043a \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430\u0415\u0441\u0442\u044c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 gRPC (ktms.v1) \u0438 OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 HTTP. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043d\u0430 OpenAI SDK \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043c\u0435\u043d\u043e\u0439 base_url:from openai import OpenAIclient = OpenAI(base_url=&#187;http:\/\/localhost:8080\/v1&#8243;, api_key=&#187;ktms_&lt;\u0432\u0430\u0448 \u043a\u043b\u044e\u0447&gt;&#187;)reply = client.chat.completions.create(    model=&#187;auto&#187;,    messages=[{&#171;role&#187;: &#171;user&#187;, &#171;content&#187;: &#171;Say hi in three words.&#187;}],)print(reply.choices[0].message.content, reply.model)\u0412 \u043e\u0442\u0432\u0435\u0442\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 X-KTMS-Vendor, X-KTMS-Rule \u0438 X-KTMS-Placement \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u043a\u0442\u043e \u0438 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \u043e\u0442\u0432\u0435\u0442\u0438\u043b.\u0427\u0442\u043e \u0443\u043c\u0435\u0435\u0442 (\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 1.3)\u041c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f: effort LOW\/MEDIUM\/HIGH \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443, \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0444\u043e\u043b\u0431\u044d\u043a\u043e\u0432, model: &#171;auto&#187; \u0441 \u0441\u0443\u0434\u044c\u0451\u0439 (250 \u043c\u0441, \u043e\u0442\u043a\u0430\u0442 \u043d\u0430 MEDIUM), \u043a\u0430\u043d\u0430\u0440\u0435\u0439\u043a\u0438 \u0441 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439 \u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, shadow-\u0442\u0440\u0430\u0444\u0438\u043a \u0441 \u043e\u0446\u0435\u043d\u043a\u043e\u0439, \u0441\u0443\u0445\u043e\u0439 \u043f\u0440\u043e\u0433\u043e\u043d ktms route explain.\u041d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c: circuit breaker, \u043f\u0430\u0443\u0437\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e Retry-After, \u043e\u0434\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u2014 \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0435 Postgres \u0438 Redis.\u0414\u0435\u043d\u044c\u0433\u0438 \u0438 \u043b\u0438\u043c\u0438\u0442\u044b: RPM\/TPM \u0438 allowlist \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0430 \u043a\u043b\u044e\u0447, \u0434\u043d\u0435\u0432\u043d\u044b\u0435 \u0438 \u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0435 \u043b\u0438\u043c\u0438\u0442\u044b \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u043d\u0430 \u043a\u043b\u044e\u0447, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e, \u0446\u0435\u043d\u044b prompt cache, Batch API \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432.\u0421\u0432\u043e\u0438 GPU: \u0430\u0433\u0435\u043d\u0442 \u043d\u043e\u0434\u044b \u0434\u043b\u044f Ollama, vLLM, TGI \u0438 llama.cpp, \u0434\u043e\u043f\u0443\u0441\u043a \u043f\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, placement \u00ab\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0438 \u043d\u043e\u0434\u044b\u00bb, \u0443\u0440\u043e\u0432\u043d\u0438 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u0438 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b ktms-node stats.\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c: \u043a\u043b\u044e\u0447\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432 \u0432 Postgres \u043f\u043e\u0434 AES-256-GCM \u0438 \u0438\u0445 \u0440\u043e\u0442\u0430\u0446\u0438\u044f, \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 PII, \u0434\u0435\u0442\u0435\u043a\u0446\u0438\u044f prompt injection, \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u0435 guardrails \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u044d\u0448 (\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e).API: gRPC ktms.v1 \u0438 OpenAI-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 HTTP, \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433, tool calling, JSON Schema \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c, embeddings, TTS, \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, Judge.\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435: CLI ktms \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438 \u0438 ktms init, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432 YAML (plan\/apply), MCP-\u0441\u0435\u0440\u0432\u0435\u0440 ktms mcp \u0434\u043b\u044f \u0418\u0418-\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043e\u0432, \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f Claude Code, scope admin:read, \u0432\u0435\u0431-\u043a\u043e\u043d\u0441\u043e\u043b\u044c ktms-admin.\u042d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f: \u043c\u0435\u0442\u0440\u0438\u043a\u0438 ktms_* \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0430\u043b\u0435\u0440\u0442\u0430\u043c\u0438, Helm-\u0447\u0430\u0440\u0442 \u0432 OCI, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u0441 SBOM \u0438 SLSA, \u0442\u0435\u0441\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c PR.\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043cKeystone \u2014 \u043e\u0434\u0438\u043d Go-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430. \u041d\u0430 \u0441\u0442\u0435\u043d\u0434\u0435 \u0438\u0437 11 \u0448\u043b\u044e\u0437\u043e\u0432 (Google Cloud c3-standard-4, 4 vCPU, mock-\u0430\u043f\u0441\u0442\u0440\u0438\u043c, \u0434\u0432\u0430 \u043f\u0440\u043e\u0433\u043e\u043d\u0430):~7 \u041c\u0438\u0411 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 ~20 \u041c\u0438\u0411 \u043f\u0440\u0438 200 RPS (Postgres \u0438 Redis \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f);~0,64 \u043c\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0430 p50 \u0438 ~1,1 \u043c\u0441 \u043d\u0430 p99;\u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 4000 RPS \u043d\u0430 4 vCPU \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a;~170 \u043c\u0441 \u043e\u0442 docker start \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430;\u043e\u0431\u0440\u0430\u0437 ~21 \u041c\u0411 \u043d\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435.\u041c\u044b \u043d\u0435 \u0441\u0430\u043c\u044b\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0435: agentgateway, Apache APISIX \u0438 Kong \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u0442\u0440\u0430\u0442\u044f\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 CPU \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441. \u0417\u0430\u0442\u043e \u043f\u043e \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438, \u0441\u0442\u0430\u0440\u0442\u0430 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Keystone \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435.\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 p50 \u0443 \u0448\u043b\u044e\u0437\u043e\u0432 \u0441\u0442\u0435\u043d\u0434\u0430\u0427\u0442\u043e \u0432\u043e\u0448\u043b\u043e \u0432 \u0440\u0435\u043b\u0438\u0437\u0427\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u043f\u0443\u0442\u0438 \u043e\u0442 0.13 \u043a 1.0.\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u041a\u043b\u044e\u0447\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0423 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u0432\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438 \u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0439 \u0431\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u0432\u0441\u0435 \u0435\u0451 \u043a\u043b\u044e\u0447\u0438. ListModels \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0451 \u043c\u043e\u0434\u0435\u043b\u0438.\u041d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432. \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0442\u0440\u0430\u0438 SDK \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0434\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u2014 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 \u0432\u0435\u043d\u0434\u043e\u0440\u0430. \u0428\u043b\u044e\u0437 \u0447\u0438\u0442\u0430\u0435\u0442 Retry-After (\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438 \u0443 Gemini) \u0438 \u0441\u0442\u0430\u0432\u0438\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0432\u0435\u043d\u0434\u043e\u0440\u0430, \u0430 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0438\u0434\u0451\u0442 \u0434\u0430\u043b\u044c\u0448\u0435. \u041f\u043b\u044e\u0441 circuit breaker \u043d\u0430 \u043f\u0430\u0440\u0443 (\u0432\u0435\u043d\u0434\u043e\u0440, \u043c\u043e\u0434\u0435\u043b\u044c).\u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041e\u043f\u0438\u0441\u0430\u043d\u043e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f. \u041f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0435 Postgres \u043a\u043b\u044e\u0447\u0438, \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 5 \u043c\u0438\u043d\u0443\u0442, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0434\u0451\u0442 \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043d\u0438\u043c\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0435 Redis \u043b\u0438\u043c\u0438\u0442\u044b \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u0442\u0440\u0430\u0444\u0438\u043a (\u0434\u043b\u044f \u0434\u0435\u043d\u0435\u0433 \u0440\u0435\u0436\u0438\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e). \u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0443\u0447\u0451\u0442\u0430 \u043a\u043e\u043f\u044f\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437.\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c. JSON Schema \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u0435\u043d\u0434\u043e\u0440\u0430\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 enum, format, nullable \u0438 additionalProperties. \u0415\u0441\u043b\u0438 \u0432\u0435\u043d\u0434\u043e\u0440 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434, \u0448\u043b\u044e\u0437 \u0441\u0430\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0432\u0435\u0442, \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438.\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u043e\u0434\u044b \u043f\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0410\u0433\u0435\u043d\u0442 \u043d\u043e\u0434\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0434\u0432\u0438\u0436\u043a\u0430 (vLLM, TGI, llama.cpp), \u0438 \u0448\u043b\u044e\u0437 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043d\u043e\u0434\u0443, \u0433\u0434\u0435 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0434\u043e\u043b\u044c\u0448\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e.\u0420\u043e\u0442\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430: \u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0448\u0438\u0444\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u043a\u043b\u044e\u0447\u0430, RotateEncryption \u043f\u0435\u0440\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u043a\u043b\u044e\u0447\u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432 \u0438 \u0442\u043e\u043a\u0435\u043d\u044b \u043d\u043e\u0434 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 Postgres \u0432 CI.\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u043b\u0438\u0437\u044b. \u041e\u0431\u0440\u0430\u0437\u044b \u0438 checksums.txt \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b cosign \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 keyless, \u0443 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0435\u0441\u0442\u044c SBOM \u0438 SLSA-provenance, \u0443 \u0430\u0440\u0445\u0438\u0432\u043e\u0432 SPDX SBOM. govulncheck \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c pull request.\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f Apache 2.0 \u0432\u043c\u0435\u0441\u0442\u043e MIT: \u044f\u0432\u043d\u0430\u044f \u043f\u0430\u0442\u0435\u043d\u0442\u043d\u0430\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0448\u043b\u044e\u0437 \u0432 \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b.\u041d\u0435\u0434\u0430\u0432\u043d\u044f\u044f \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u0430 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 Python-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430\u043f\u043e\u043c\u043d\u0438\u043b\u0430, \u0447\u0442\u043e \u0448\u043b\u044e\u0437 \u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u043b\u044e\u0447\u0438 \u043a\u043e \u0432\u0441\u0435\u043c \u0432\u0435\u043d\u0434\u043e\u0440\u0430\u043c \u0441\u0440\u0430\u0437\u0443. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0442\u043e\u0433\u043e \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u0430 \u0438 \u0447\u0442\u043e \u0438\u0437 \u043d\u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u2014 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.\u0414\u0432\u0430 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430ktms-admin \u2014 \u0432\u0435\u0431-\u043a\u043e\u043d\u0441\u043e\u043b\u044c: \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u043a\u043b\u044e\u0447\u0438, \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432 \u0438 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 \u0432\u0430\u0448\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0412\u0445\u043e\u0434 \u043f\u043e \u043f\u0430\u0440\u043e\u043b\u044e, \u0447\u0435\u0440\u0435\u0437 Google \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 OpenID Connect, GitHub \u0438\u043b\u0438 \u0432\u0430\u0448 access-\u043f\u0440\u043e\u043a\u0441\u0438 (oauth2-proxy, Authelia, Authentik, Pomerium, Cloudflare Access) \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432. \u041e\u0434\u0438\u043d \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0441\u0442\u0440\u043e\u0435\u043d, \u0441\u0431\u043e\u0440\u043a\u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430 \u043d\u0435\u0442.light-tokenmeter \u2014 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043a\u0442\u043e \u0442\u0440\u0430\u0442\u0438\u0442 \u0442\u043e\u043a\u0435\u043d\u044b \u0438 \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u043e\u043d\u043e \u0442\u043e\u0433\u043e\u00bb. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u0432\u043e\u0434\u043a\u0438 \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c, \u0432\u0435\u043d\u0434\u043e\u0440\u0430\u043c \u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c. \u041a\u043e\u043d\u0441\u043e\u043b\u044c \u043f\u043e \u044d\u0442\u0438\u043c \u0441\u0432\u043e\u0434\u043a\u0430\u043c \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u044b \u043a\u0430\u043a greedy \u0438\u043b\u0438 worthy. \u041e\u0434\u0438\u043d \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u043e\u0434\u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 Postgres, ClickHouse \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e.\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 ktms-admin \u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u0432 light-tokenmeter\u041a\u0430\u043a \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044cgit clone https:\/\/github.com\/ai-process\/ktms.git &amp;&amp; cd ktmsOPENAI_API_KEY=sk-&#8230; docker compose up -d &#8212;buildcurl -s http:\/\/localhost:8080\/v1\/chat\/completions \\  -H &#171;Authorization: Bearer ktms_dev_default_key&#187; -H &#171;Content-Type: application\/json&#187; \\  -d &#8216;{&#171;model&#187;:&#187;auto&#187;,&#187;messages&#187;:[{&#171;role&#187;:&#187;user&#187;,&#187;content&#187;:&#187;Say hi in three words.&#187;}]}&#8217;Compose \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 Postgres, Redis \u0438 \u0448\u043b\u044e\u0437 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438, \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 \u0438 \u043a\u043b\u044e\u0447\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.\u0427\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 1.0\u0414\u043e 1.0 \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043e\u0431\u0435\u0449\u0430\u043b\u0438. \u0421 1.0 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 1.x \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f:\u041f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c\u0427\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 1.xgRPC ktms.v1RPC, \u043f\u043e\u043b\u044f, enum \u0438 \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u043b\u0435\u0439. buf breaking \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 pull requestHTTP \/v1 \u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 X-KTMS-*\u041f\u0443\u0442\u0438, \u043f\u043e\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u0438\u043c\u0435\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0418\u043c\u0435\u043d\u0430, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u0441\u043c\u044b\u0441\u043b\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\u041b\u044e\u0431\u043e\u0439 1.x \u0441\u0430\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0431\u0430\u0437\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e, \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0433\u043e SQL\u041c\u0435\u0442\u0440\u0438\u043a\u0438 ktms_*, \u0441\u043e\u0431\u044b\u0442\u0438\u044f usage.v1, \u0430\u0433\u0435\u043d\u0442 \u043d\u043e\u0434\u044b\u0418\u043c\u0435\u043d\u0430, \u043c\u0435\u0442\u043a\u0438, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b\u041a\u043e\u0434\u044b \u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u043e\u0448\u0438\u0431\u043e\u043a\u0421\u043c\u044b\u0441\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f, \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f\u0427\u0442\u043e \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043c\u0438\u043d\u043e\u0440\u043d\u043e\u043c \u0440\u0435\u043b\u0438\u0437\u0435: \u0432\u044b\u0431\u043e\u0440 effort \u0441\u0443\u0434\u044c\u0451\u0439, shadow-\u0442\u0440\u0430\u0444\u0438\u043a, \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u044d\u0448 \u0438 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u0435 guardrails, JudgeStream \u0438 EvaluateRollouts, \u0444\u043e\u0440\u043c\u0430\u0442 YAML-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 ktms \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 v1. \u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u2014 \u0432 README, \u0430 \u0432 proto \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u044b \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c Experimental:.\u041e\u0431\u0435\u0449\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c pull request \u0438 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c \u0442\u0435\u0441\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u0430\u0437\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430 \u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430 \u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0436\u043e\u0440\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043c\u0438\u0433\u0440\u0438\u0440\u0443\u0435\u0442 \u0435\u0451 \u043d\u043e\u0432\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043d\u0430 \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435. \u0422\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435, \u0438 rolling-\u0434\u0435\u043f\u043b\u043e\u0439. \u0420\u0435\u043b\u0438\u0437 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0438 buf breaking.\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435\u041f\u043e\u0441\u043b\u0435 1.0 \u0432 \u043f\u043b\u0430\u043d\u0430\u0445: \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0432\u043e\u0438 \u043d\u043e\u0434\u044b, hedged-\u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0432\u0442\u043e\u0440 \u0434\u043b\u044f JSON, Grafana-\u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0438 \u0440\u0435\u0446\u0435\u043f\u0442\u044b \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u041d\u0438\u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 API 1.x\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439: github.com\/ai-process\/ktms\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: ai-process.dev\u041a\u043e\u043d\u0441\u043e\u043b\u044c: github.com\/ai-process\/ktms-admin\u0423\u0447\u0451\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432: github.com\/ai-process\/light-tokenmeter\u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u043c.\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 https:\/\/habr.com\/ru\/articles\/1099790\/<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-500455","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=500455"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500455\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=500455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=500455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=500455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}