Часто бывает так, что функциям или потребителям агента нужно что-то знать, что самому агенту знать совсем не обязательно. Для этого есть три имплицитных словаря, которые доступны функциям, но недоступны агенту.
statestate - это дата-контекст агента. Рассмотрим его жизненный цикл:
name и phone, то при запуске агента словарь state инициализируется с указанными их значениями:{
"name": "user",
"phone": "88005553535"
}
def what_is_my_name():
name = state.get("name", None)
return name
Обратите внимание, что передавать state в аргументах функции не нужно.
def update_phone(new_phone):
state["phone"] = new_phone
return f"Номер {new_phone} успешно записан!"
Обратите внимание, что возвращать state не нужно. Он будет обновлен автоматически.
state сохраняется, но дополнится значениями аргументов нового агентаИтого, в словарь state можно помещать функциями любые значения: число вызовов функции, ответы API, ответы пользователя. Он полезен для хардкода логики.
contextcontext - это история диалога агента. Он синхронизирован с актуальной коммитнутой историей агента и так же как и 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-ключей и чувствительных данных.