Консоль
Кейсы

State, context, secrets

Как передавать скрытый контекст в инструменты и интеграции

Часто бывает так, что функциям или потребителям агента нужно что-то знать, что самому агенту знать совсем не обязательно. Для этого есть три имплицитных словаря, которые доступны функциям, но недоступны агенту.

state

state - это дата-контекст агента. Рассмотрим его жизненный цикл:

  1. Если у агента есть аргументы, например name и phone, то при запуске агента словарь state инициализируется с указанными их значениями:
{
    "name": "user",
    "phone": "88005553535"
}
  1. В ходе диалога, любые функции могут читать и использовать значения из словаря, например:
def what_is_my_name():
    name = state.get("name", None)
    return name

Обратите внимание, что передавать state в аргументах функции не нужно.

  1. Функции также могут заменять эти значения. Например:
def update_phone(new_phone):
    state["phone"] = new_phone
    return f"Номер {new_phone} успешно записан!"

Обратите внимание, что возвращать state не нужно. Он будет обновлен автоматически.

  1. При переходе в другого агента, state сохраняется, но дополнится значениями аргументов нового агента

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

context

context - это история диалога агента. Он синхронизирован с актуальной коммитнутой историей агента и так же как и state доступен всем функциям.

Коммитнутая история - это фактический контекст (промт) агента. Она отличается от того, что видно в Аудите или в веб-интерфейсе: она чище, но опускает некоторые фразы пользователя и агента, которые наша система посчитала нерелевантными. Например, если агент был перебит на первом же слове, фраза агента не сохранится в истории.

Давайте посмотрим как может выглядеть context:

{
  "messages": [
    {
      "role": "system", 
      "content": "<str>"
    },
    {
      "role": "user", 
      "content": "<str>"
    },
    {
      "role": "assistant", 
      "content": "<str>|None", 
      "tool_calls": [
        {
          "id": "<str>",
          "type": "function",
          "function": {
            "name": "<str>", 
            "arguments": "<json-string>"
          }
        }
      ]
    },
    {
      "role": "tool", 
      "content": "<str>", 
      "tool_call_id": "<str>"
    }
  ]
}

Таким образом, чтобы получить последнее сообщение, напишите

last_message = context["messages"][-1]

Итого, context можно использовать для хардкода поведения на основе реплик, вызовов инструментов. Контролируйте ключевые слова и вызовы инструментов.

secrets

При настройке функции вы увидите кнопку секреты. Если ее нажать и создать там секрет, то вы сможете один раз определить ключ (название) и значение этого секрета. Далее никто, кроме функции, не сможет увидеть значение этого секрета.

Функции смогут. Вот так:

secret_value = secrets.get("secret_name")

Ценность секретов в том, что если пользователи не имеют никаких прав редактирования функций, а сущенствующие функции не возвращают секретов в своем ответе, то узнать их значение будет невозможно. Используйте их для хранения API-ключей и чувствительных данных.