При миграции с Text Completions на Messages учитывайте следующие изменения.

Входные и выходные данные

Самое большое изменение между Text Completions и Messages - это способ указания входных данных модели и получения выходных данных от модели.

В Text Completions входные данные представляют собой необработанные строки:

Python
prompt = "\n\nHuman: Привет\n\nAssistant: Привет, я Claude. Чем я могу помочь?\n\nHuman: Можешь объяснить мне гликолиз?\n\nAssistant:"

В Messages вы указываете список входных сообщений вместо необработанного промпта:

messages = [
  {"role": "user", "content": "Привет."},
  {"role": "assistant", "content": "Привет, я Claude. Чем я могу помочь?"},
  {"role": "user", "content": "Можешь объяснить мне гликолиз?"},
]

Каждое входное сообщение имеет role и content.

Названия ролей

API Text Completions ожидает чередующиеся реплики \n\nHuman: и \n\nAssistant:, но API Messages ожидает роли user и assistant. Вы можете увидеть в документации упоминания как “human”, так и “user”. Они относятся к одной и той же роли, и в дальнейшем будет использоваться “user”.

В Text Completions сгенерированный моделью текст возвращается в значениях completion ответа:

Python
>>> response = anthropic.completions.create(...)
>>> response.completion
" Привет, я Claude"

В Messages ответ - это значение content, которое представляет собой список блоков контента:

Python
>>> response = anthropic.messages.create(...)
>>> response.content
[{"type": "text", "text": "Привет, я Claude"}]

Вкладывание слов в уста Claude

В Text Completions вы можете предварительно заполнить часть ответа Claude:

Python
prompt = "\n\nHuman: Привет\n\nAssistant: Привет, меня зовут"

В Messages вы можете достичь того же результата, сделав последнее входное сообщение с ролью assistant:

Python
messages = [
  {"role": "human", "content": "Привет"},
  {"role": "assistant", "content": "Привет, меня зовут"},
]

При этом content ответа будет продолжением content последнего входного сообщения:

JSON
{
  "role": "assistant",
  "content": [{"type": "text", "text": " Claude. Чем я могу вам помочь сегодня?" }],
  ...
}

Системный промпт

В Text Completions системный промпт указывается путем добавления текста перед первой репликой \n\nHuman::

Python
prompt = "Сегодня 1 января 2024 года.\n\nHuman: Привет, Claude\n\nAssistant:"

В Messages вы указываете системный промпт с помощью параметра system:

Python
anthropic.Anthropic().messages.create(
    model="claude-3-opus-20240229",
    max_tokens=1024,
    system="Сегодня 1 января 2024 года.", # <-- системный промпт
    messages=[
        {"role": "user", "content": "Привет, Claude"}
    ]
)

Названия моделей

API Messages требует указания полной версии модели (например, claude-3-opus-20240229).

Ранее мы поддерживали указание только основного номера версии (например, claude-2), что приводило к автоматическому обновлению до дополнительных версий. Однако мы больше не рекомендуем этот шаблон интеграции, и Messages его не поддерживает.

Причина остановки

Text Completions всегда имеют stop_reason либо:

  • "stop_sequence": Модель либо естественным образом завершила свою очередь, либо была сгенерирована одна из ваших пользовательских стоп-последовательностей.
  • "max_tokens": Либо модель сгенерировала указанное вами количество max_tokens контента, либо достигла своего абсолютного максимума.

Messages имеют stop_reason одного из следующих значений:

  • "end_turn": Диалоговый ход естественным образом завершился.
  • "stop_sequence": Была сгенерирована одна из указанных вами пользовательских стоп-последовательностей.
  • "max_tokens": (без изменений)

Указание максимального количества токенов

  • Text Completions: параметр max_tokens_to_sample. Нет валидации, но ограниченные значения для каждой модели.
  • Messages: параметр max_tokens. Если передать значение, превышающее поддерживаемое моделью, возвращается ошибка валидации.

Формат потоковой передачи

При использовании "stream": true в Text Completions ответ включал любые из completion, ping и error серверных событий. Подробнее см. в Text Completions streaming.

Messages могут содержать несколько блоков контента различных типов, поэтому формат потоковой передачи несколько более сложный. Подробнее см. в Messages streaming.