Создание защищённого рабочего процесса с шифрованием для агентов ИИ с динамическим выбором LLM и интеграцией API

В этом руководстве мы рассмотрим создание компактного, но функционального рабочего процесса на основе шифрования.

Шаг 1: безопасное хранение ключа API Gemini

Мы начинаем с безопасного ввода ключа API Gemini с помощью `getpass`, чтобы он оставался скрытым в пользовательском интерфейсе Colab. Затем мы определяем функцию `choose_llm()`, которая проверяет переменные окружения и автоматически выбирает подходящего провайдера LLM, модель и ключ на основе доступных.

Шаг 2: определение функции `choose_llm()`

“`python
def choose_llm():
if os.getenv(“OPENAIAPIKEY”):
return “openai”, “gpt-4o-mini”, “OPENAIAPIKEY”
if os.getenv(“GEMINIAPIKEY”):
return “gemini”, “gemini-2.5-flash”, “GEMINIAPIKEY”
if os.getenv(“ANTHROPICAPIKEY”):
return “anthropic”, “claude-3-5-haiku-20241022”, “ANTHROPICAPIKEY”
raise RuntimeError(“Set one API key before running.”)
“`

Шаг 3: создание вспомогательной функции `run()`

Мы создаём вспомогательную функцию `run()`, которая выполняет командные строки, выводит `stdout` и `stderr` для наглядности и выдаёт ошибку, если команда не выполнена, когда `check` включён, делая выполнение рабочего процесса более прозрачным и надёжным.

“`python
def run(cmd, check=True, env=None):
print(“▸”, cmd)
p = subprocess.run(cmd, shell=True, text=True, capture_output=True, env=env)
if p.stdout: print(p.stdout)
if p.stderr: print(p.stderr)
if check and p.returncode != 0:
raise RuntimeError(f”Command failed: {cmd}”)
return p
“`

Шаг 4: определение функции `ensurenodeand_cipher()`

Мы определяем `ensurenodeand_cipher()`, чтобы установить `Node.js`, `npm` и `Cipher CLI` глобально, обеспечивая наличие всех необходимых зависимостей в нашей среде перед выполнением команд, связанных с `Cipher`.

“`python
def ensurenodeand_cipher():
run(“sudo apt-get update -y && sudo apt-get install -y nodejs npm”, check=False)
run(“npm install -g @byterover/cipher”)
“`

Шаг 5: генерация конфигурации `cipher.yml`

Мы реализуем `writecipheryml()`, чтобы сгенерировать файл конфигурации `cipher.yml` внутри папки `memAgent`, задавая выбранного провайдера LLM, модель и ключ API, включая системный запрос с долговременной памятью и регистрацию файлового сервера `MCP` для файловых операций.

“`python
def writecipheryml(workdir, provider, model, key_env):
cfg = “””
llm:
provider: {provider}
model: {model}
apiKey: ${key_env}
systemPrompt:
enabled: true
content: |
You are an AI programming assistant with long-term memory of prior decisions.
embedding:
disabled: true
mcpServers:
filesystem:
type: stdio
command: npx
args: [‘-y’,’@modelcontextprotocol/server-filesystem’,’.’]
“””.format(provider=provider, model=model, keyenv=keyenv)

(workdir / “memAgent”).mkdir(parents=True, exist_ok=True)
(workdir / “memAgent” / “cipher.yml”).write_text(cfg.strip() + “n”)
“`

Шаг 6: запуск Cipher в режиме API

Мы запускаем `Cipher` в режиме API как подпроцесс, затем многократно опрашиваем его конечную точку `/health`, пока он не ответит, обеспечивая готовность сервера API перед продолжением.

“`python
def start_api(env, cwd):
proc = subprocess.Popen(“cipher –mode api”, shell=True, env=env, cwd=cwd,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
for _ in range(30):
try:
r = requests.get(“http://127.0.0.1:3000/health”, timeout=2)
if r.ok:
print(“API /health:”, r.text)
break
except: pass
time.sleep(1)
return proc
“`

Шаг 7: основная функция `main()`

В `main()` мы выбираем провайдера LLM, устанавливаем зависимости и создаём временный рабочий каталог с конфигурацией `cipher.yml`. Затем мы сохраняем ключевые решения проекта в памяти `Cipher`, запрашиваем их обратно и, наконец, запускаем сервер `Cipher API` на короткое время перед его отключением, демонстрируя взаимодействие как с `CLI`, так и с `API`.

“`python
def main():
provider, model, keyenv = choosellm()
ensurenodeand_cipher()
workdir = pathlib.Path(tempfile.mkdtemp(prefix=”cipherdemo“))
writecipheryml(workdir, provider, model, key_env)
env = os.environ.copy()

cipher_once(“Store decision: use pydantic for config validation; pytest fixtures for testing.”, env, str(workdir))
cipher_once(“Remember: follow conventional commits; enforce black + isort in CI.”, env, str(workdir))

cipher_once(“What did we standardize for config validation and Python formatting?”, env, str(workdir))

apiproc = startapi(env, str(workdir))
time.sleep(3)
api_proc.terminate()

if name == “main“:
main()
“`

В результате мы получаем рабочую среду `Cipher`, которая безопасно управляет ключами API, автоматически выбирает подходящего провайдера LLM и настраивает агента с поддержкой памяти полностью через автоматизацию `Python`. Наша реализация включает логирование решений, извлечение памяти и работающий `API`-эндпоинт, все они организованы в рабочем процессе, удобном для `Notebook/Colab`. Это делает настройку пригодной для повторного использования в других конвейерах разработки с поддержкой ИИ, позволяя нам хранить и запрашивать знания проекта программно, сохраняя при этом лёгкость среды и простоту повторного развёртывания.

1. Какие методы используются для безопасного хранения ключа API Gemini в данном рабочем процессе?

Ответ: в статье предлагается использовать функцию `getpass` для безопасного ввода ключа API Gemini, чтобы он оставался скрытым в пользовательском интерфейсе Colab.

2. Как функция `choose_llm()` помогает в выборе подходящего провайдера LLM?

Ответ: функция `choose_llm()` проверяет переменные окружения и автоматически выбирает подходящего провайдера LLM, модель и ключ на основе доступных. Она возвращает кортеж с именем провайдера, моделью и ключом API.

3. Какие шаги предпринимаются для установки необходимых зависимостей перед выполнением команд, связанных с `Cipher`?

Ответ: для установки необходимых зависимостей перед выполнением команд, связанных с `Cipher`, используется функция `ensurenodeand_cipher()`. Она устанавливает `Node.js`, `npm` и `Cipher CLI` глобально, обеспечивая наличие всех необходимых зависимостей в среде перед выполнением команд.

4. Как реализуется генерация конфигурации `cipher.yml` в данном рабочем процессе?

Ответ: генерация конфигурации `cipher.yml` реализуется с помощью функции `writecipheryml()`, которая генерирует файл конфигурации `cipher.yml` внутри папки `memAgent`. В файле задаются выбранный провайдер LLM, модель и ключ API, включая системный запрос с долговременной памятью и регистрацию файлового сервера `MCP` для файловых операций.

5. Какие шаги предпринимаются для запуска `Cipher` в режиме API?

Ответ: для запуска `Cipher` в режиме API используется функция `start_api()`, которая запускает `Cipher` в режиме API как подпроцесс, затем многократно опрашивает его конечную точку `/health`, пока он не ответит, обеспечивая готовность сервера API перед продолжением.

Источник