v0.5.0: 3 стенда — изоляция состояния, WSGI middleware, OpenAPI server selector, POLYGON_STANDS env
- loader.py: STANDS dict, get_services/get_ops_index per stand, POLYGON_STANDS env
- mock_state.py: get_state(stand_id) — ленивая инициализация
- app.py: StandMiddleware — перезапись PATH_INFO до Flask-роутинга
- Все роуты: LocalProxy(state), LocalProxy(SERVICES/OPS_INDEX) через g.stand_id
- openapi.py: _build_servers() — по одному серверу на стенд
- services/stand{1,2,3}/ — 37 YAML на стенд из STANDS/dev и STANDS/test
- tests/test_api.py: +4 multi-stand теста (изоляция, fail-next, OpenAPI servers)
- Обратная совместимость: /api/v1/svc/... → стенд по умолчанию
This commit is contained in:
@@ -0,0 +1,277 @@
|
||||
name: llm_ai
|
||||
service_id: 163
|
||||
service_display_name: LLM
|
||||
service_short_name: llmAi
|
||||
service_man: '## 1. Общая информация<br/><br/>LLMaaS (Large Language Model as a Service) — это сервис для доступа к языковым моделям через OpenAI-совместимое API.<br/>Платформа позволяет создавать организации
|
||||
(тенанты), команды, выпускать и управлять API-ключами, устанавливать лимиты на использование.<br/><br/>---<br/><br/>## Доступные операции<br/><br/>- **create** — Создание организации в LLMaaS<br/>-
|
||||
**delete** — Удаление организации<br/><br/>- **create_team** — Создание команды внутри организации<br/>- **modify_team** — Редактирование команды (модели, RPM, TPM)<br/>- **delete_team** —
|
||||
Удаление команды<br/><br/>- **create_secrets** — Создание API-ключа<br/>- **update_secrets** — Обновление параметров API-ключа<br/>- **delete_secrets** — Удаление API-ключа<br/><br/>---<br/><br/>##
|
||||
2. Параметры создания организации<br/><br/>Ниже перечислены параметры, которые необходимо указать при создании организации:<br/><br/>* **Платформа для развертывания**<br/> Выбирается автоматически, изменять
|
||||
не нужно.<br/><br/>* **Период бюджета**<br/> Срок жизни организации в днях.<br/> Пример: `30`<br/><br/><br/>---<br/><br/>## 3. Параметры создания команды<br/><br/>* **Имя команды**<br/> Уникальное
|
||||
имя команды в рамках организации.<br/> Пример: `production`<br/><br/>* **Модель**<br/> Название модели, доступной для команды.<br/> Пример: `gpt-oss-120b`<br/><br/>* **Лимит запросов в минуту (RPM)**<br/> Максимальное
|
||||
количество запросов к API в минуту.<br/> Пример: `60`<br/><br/>* **Лимит токенов в минуту (TPM)**<br/> Максимальное количество токенов (входящих + исходящих) в минуту.<br/> Пример: `100000`<br/><br/>---<br/><br/>##
|
||||
4. Параметры редактирования команды<br/><br/>Для существующей команды можно изменить:<br/><br/>* **Модель**<br/> Новая модель для команды.<br/> Пример: `gpt-oss-20b`<br/><br/>* **Лимит запросов в минуту
|
||||
(RPM)**<br/> Новое значение RPM.<br/> Пример: `120`<br/><br/>* **Лимит токенов в минуту (TPM)**<br/> Новое значение TPM.<br/> Пример: `200000`<br/><br/>---<br/><br/>## 5. Параметры создания API-ключа<br/><br/>Ниже
|
||||
перечислены параметры, которые необходимо указать при создании API-ключа:<br/><br/>* **Имя ключа**<br/> Уникальное имя ключа в рамках организации.<br/> Пример: `prod-key`<br/><br/>* **Команда**<br/> Имя
|
||||
команды для привязки ключа. Если не указано — ключ привязывается к команде `main`.<br/> Пример: `production`<br/><br/>* **Модель**<br/> Название модели, доступной для данного ключа.<br/> Пример: `gpt-oss-120b`<br/><br/>*
|
||||
**Лимит запросов в минуту (RPM)**<br/> Максимальное количество запросов к API в минуту.<br/> Пример: `60`<br/><br/>* **Лимит токенов в минуту (TPM)**<br/> Максимальное количество токенов (входящих
|
||||
+ исходящих) в минуту.<br/> Пример: `100000`<br/><br/>**Важно:** Лимиты API-ключа не могут превышать лимиты команды, к которой он привязан.<br/>При превышении операция будет отклонена с ошибкой.<br/>Перед
|
||||
созданием ключа убедитесь, что `RPM <= team.RPM` и `TPM <= team.TPM`.<br/><br/><br/>---<br/><br/>## 6. Параметры обновления API-ключа<br/><br/>Для уже существующего ключа можно изменить параметры. Все
|
||||
параметры являются опциональными:<br/><br/>* **Имя ключа**<br/> Имя обновляемого ключа.<br/> Пример: `prod-key`<br/><br/>* **Модель**<br/> Новое название модели.<br/> Пример: `gpt-oss-20b`<br/><br/>*
|
||||
**Лимит запросов в минуту (RPM)**<br/> Новое значение RPM.<br/> Пример: `120`<br/><br/>* **Лимит токенов в минуту (TPM)**<br/> Новое значение TPM.<br/> Пример: `200000`<br/><br/>**Важно:** При обновлении
|
||||
лимитов API-ключа новые значения не могут превышать лимиты команды.<br/>Если указать значения выше командных, операция завершится ошибкой.<br/>Указывайте `RPM <= team.RPM` и `TPM <= team.TPM`.<br/><br/>Команда
|
||||
определяется автоматически по стейту услуги — изменить привязку к другой команде через эту операцию нельзя.<br/><br/>---<br/><br/>## 7. Параметры удаления API-ключа<br/><br/>* **Команда**<br/> Имя команды,
|
||||
к которой привязан ключ.<br/> Пример: `production`<br/><br/>* **Имя ключа**<br/> Имя удаляемого ключа.<br/> Пример: `prod-key`<br/><br/>---<br/><br/>## 8. Параметры удаления команды<br/><br/>* **Имя
|
||||
команды**<br/> Имя удаляемой команды.<br/> Пример: `production`<br/><br/>---<br/><br/>## 9. Параметры удаления организации<br/><br/>Удаление организации не требует дополнительных параметров — удаляется
|
||||
вся организация со всеми командами и ключами.<br/><br/>---<br/><br/>## 10. Выходные параметры<br/><br/>После успешного создания организации платформа возвращает:<br/><br/>* **connectionUrl**<br/> URL
|
||||
для доступа к inference API (OpenAI-совместимый).<br/> Пример: `https://api.aillm.ru`<br/><br/>---<br/><br/><br/>## 12. Пример использования API<br/><br/>После получения API-ключа клиент может обращаться
|
||||
к LLMaaS напрямую:<br/><br/>**Запрос к chat completions:**<br/><br/>```bash<br/>curl https://api.aillm.ru/v1/chat/completions \<br/> -H "Authorization: Bearer sk-..." \<br/> -H "Content-Type: application/json"
|
||||
\<br/> -d ''{<br/> "model": "gpt-oss-120b",<br/> "messages": [<br/> {"role": "user", "content": "Привет!"}<br/> ]<br/> }''<br/>```<br/><br/>**Получение списка доступных моделей:**<br/><br/>```bash<br/>curl
|
||||
https://api.aillm.ru/v1/models \<br/> -H "Authorization: Bearer sk-..."<br/>```<br/>'
|
||||
lifecycle:
|
||||
suspendOnDestroyDefault: false
|
||||
adoptExistingOnCreateDefault: false
|
||||
operations:
|
||||
- svcOperationId: 271
|
||||
operation: create
|
||||
kind: instance
|
||||
action: create
|
||||
- svcOperationId: 274
|
||||
operation: create_secrets
|
||||
kind: subresource
|
||||
action: create
|
||||
- svcOperationId: 278
|
||||
operation: create_team
|
||||
kind: subresource
|
||||
action: create
|
||||
- svcOperationId: 273
|
||||
operation: delete
|
||||
kind: instance
|
||||
action: delete
|
||||
- svcOperationId: 275
|
||||
operation: delete_secrets
|
||||
kind: subresource
|
||||
action: delete
|
||||
- svcOperationId: 280
|
||||
operation: delete_team
|
||||
kind: subresource
|
||||
action: delete
|
||||
- svcOperationId: 279
|
||||
operation: modify_team
|
||||
kind: subresource
|
||||
action: modify
|
||||
- svcOperationId: 277
|
||||
operation: update_secrets
|
||||
kind: subresource
|
||||
action: update
|
||||
stateOut:
|
||||
secrets: {}
|
||||
teams: {}
|
||||
cfsParams:
|
||||
- svcOperationCfsParamId: 826
|
||||
svcOperationCfsParam: resourceRealm
|
||||
dataType: string
|
||||
isRequired: true
|
||||
defaultValue: llmAi.aillm.ru
|
||||
isModifiable: false
|
||||
valueList:
|
||||
- llmAi.aillm.ru
|
||||
- svcOperationCfsParamId: 833
|
||||
svcOperationCfsParam: models
|
||||
dataType: array
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: false
|
||||
- svcOperationCfsParamId: 834
|
||||
svcOperationCfsParam: rpmLimit
|
||||
dataType: integer > 0
|
||||
isRequired: true
|
||||
defaultValue: '60'
|
||||
isModifiable: false
|
||||
- svcOperationCfsParamId: 835
|
||||
svcOperationCfsParam: tpmLimit
|
||||
dataType: integer > 0
|
||||
isRequired: true
|
||||
defaultValue: '100000'
|
||||
isModifiable: false
|
||||
- svcOperationCfsParamId: 857
|
||||
svcOperationCfsParam: keyName
|
||||
dataType: string
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: false
|
||||
- svcOperationCfsParamId: 859
|
||||
svcOperationCfsParam: teamName
|
||||
dataType: string
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: false
|
||||
- svcOperationCfsParamId: 1083
|
||||
svcOperationCfsParam: variablesKeys
|
||||
dataType: array-map-fixed
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: false
|
||||
dataDescriptor:
|
||||
teamName:
|
||||
dataType: string
|
||||
defaultValue: ''
|
||||
isRequired: true
|
||||
isModifiable: false
|
||||
keyName:
|
||||
dataType: string
|
||||
defaultValue: ''
|
||||
isRequired: true
|
||||
isModifiable: false
|
||||
models:
|
||||
dataType: string
|
||||
defaultValue: ''
|
||||
isRequired: true
|
||||
isModifiable: false
|
||||
valueList:
|
||||
- '{}'
|
||||
tpmLimit:
|
||||
dataType: integer > 0
|
||||
defaultValue: '100000'
|
||||
isRequired: true
|
||||
isModifiable: false
|
||||
rpmLimit:
|
||||
dataType: integer > 0
|
||||
defaultValue: '60'
|
||||
isRequired: true
|
||||
isModifiable: false
|
||||
count:
|
||||
dataType: integer > 0
|
||||
defaultValue: '1'
|
||||
isRequired: true
|
||||
isModifiable: false
|
||||
- svcOperationCfsParamId: 858
|
||||
svcOperationCfsParam: teamName
|
||||
dataType: string
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: false
|
||||
- svcOperationCfsParamId: 860
|
||||
svcOperationCfsParam: models
|
||||
dataType: array
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: false
|
||||
- svcOperationCfsParamId: 861
|
||||
svcOperationCfsParam: rpmLimit
|
||||
dataType: integer > 0
|
||||
isRequired: true
|
||||
defaultValue: '60'
|
||||
isModifiable: false
|
||||
- svcOperationCfsParamId: 862
|
||||
svcOperationCfsParam: tpmLimit
|
||||
dataType: integer > 0
|
||||
isRequired: true
|
||||
defaultValue: '100000'
|
||||
isModifiable: false
|
||||
- svcOperationCfsParamId: 836
|
||||
svcOperationCfsParam: keyName
|
||||
dataType: string
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: true
|
||||
- svcOperationCfsParamId: 876
|
||||
svcOperationCfsParam: teamName
|
||||
dataType: string
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: true
|
||||
- svcOperationCfsParamId: 868
|
||||
svcOperationCfsParam: teamName
|
||||
dataType: string
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: true
|
||||
- svcOperationCfsParamId: 864
|
||||
svcOperationCfsParam: teamName
|
||||
dataType: string
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: true
|
||||
- svcOperationCfsParamId: 865
|
||||
svcOperationCfsParam: models
|
||||
dataType: array
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: true
|
||||
- svcOperationCfsParamId: 873
|
||||
svcOperationCfsParam: rpmLimit
|
||||
dataType: integer > 0
|
||||
isRequired: true
|
||||
defaultValue: '60'
|
||||
isModifiable: true
|
||||
- svcOperationCfsParamId: 874
|
||||
svcOperationCfsParam: tpmLimit
|
||||
dataType: integer > 0
|
||||
isRequired: true
|
||||
defaultValue: '100000'
|
||||
isModifiable: true
|
||||
- svcOperationCfsParamId: 852
|
||||
svcOperationCfsParam: keyName
|
||||
dataType: string
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: true
|
||||
- svcOperationCfsParamId: 853
|
||||
svcOperationCfsParam: models
|
||||
dataType: array
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: true
|
||||
- svcOperationCfsParamId: 854
|
||||
svcOperationCfsParam: rpmLimit
|
||||
dataType: integer > 0
|
||||
isRequired: true
|
||||
defaultValue: '60'
|
||||
isModifiable: true
|
||||
- svcOperationCfsParamId: 855
|
||||
svcOperationCfsParam: tpmLimit
|
||||
dataType: integer > 0
|
||||
isRequired: true
|
||||
defaultValue: '100000'
|
||||
isModifiable: true
|
||||
- svcOperationCfsParamId: 875
|
||||
svcOperationCfsParam: teamName
|
||||
dataType: string
|
||||
isRequired: true
|
||||
defaultValue: ''
|
||||
isModifiable: true
|
||||
cfsParamsByOp:
|
||||
271:
|
||||
- 826
|
||||
274:
|
||||
- 833
|
||||
- 834
|
||||
- 835
|
||||
- 857
|
||||
- 859
|
||||
- 1083
|
||||
278:
|
||||
- 858
|
||||
- 860
|
||||
- 861
|
||||
- 862
|
||||
273: []
|
||||
275:
|
||||
- 836
|
||||
- 876
|
||||
280:
|
||||
- 868
|
||||
279:
|
||||
- 864
|
||||
- 865
|
||||
- 873
|
||||
- 874
|
||||
277:
|
||||
- 852
|
||||
- 853
|
||||
- 854
|
||||
- 855
|
||||
- 875
|
||||
stateParams:
|
||||
resourceRealm: llmAi.aillm.ru
|
||||
Reference in New Issue
Block a user