t27.aiEnglish

Разум: ответ с формой

Вы узнаете

Почему программа просит у агента ответ с фиксированной формой и как она отклоняет ответ с неверной формой.

Когда вы говорите с агентом, вы читаете свободный текст. Когда ответ читает программа, свободный текст мешает: она не отличит фразу от просьбы что-то запустить. Поэтому у агента просят ответ с формой: вид и столько аргументов, сколько нужно этому виду. В этой спецификации 3 вида: 0 сказать, 1 спросить и 2 вызвать инструмент. Фразе аргумент не нужен; вопросу и вызову инструмента нужен хотя бы 1. Программа сначала проверяет форму и действует, только если она подходит. Вызов инструмента без имени файла отклоняется до того, как что-либо запустится. Отрицательный контроль вносит ошибку в одном месте: поставьте NEEDS_CALL равным 0, и тест the_bad_reply_is_refused покраснеет, потому что ответ без аргументов больше не считается слишком коротким.

Попробуйте

Откройте виджет и найдите, какому виду аргумент не нужен; затем запустите спецификацию, поставьте NEEDS_CALL равным 0 и прочитайте, какой тест падает и почему. Верните строку и запустите снова.

Открыть интерактивный урок →

Vibecoding 19: an answer with a shape ↗

Three kinds of agent reply, how many arguments each needs, and the check a program runs before it acts on one. Lesson 19 of the Vibecoding from zero course.

specs/vibecoding/agent_mind.t27

// SPDX-License-Identifier: Apache-2.0
; specs/vibecoding/agent_mind.t27 -- vibecoding lesson 19: the mind of an agent, an answer with a shape.
; When a program has to read an agent's answer, free text is not enough: the agent hands back a
; reply with a fixed shape, a kind plus the arguments that kind needs. A program refuses a reply
; whose shape is wrong before it acts on it. Kinds: 0 say, 1 ask, 2 call a tool.
; A sentence needs no argument; a question needs one; a tool call needs at least one.
; Run the tests, then plant the bug named at the bottom and watch one test turn red.

module vibecoding_agent_mind;

pub const KIND_SAY : u8 = 0;
pub const KIND_ASK : u8 = 1;
pub const KIND_CALL : u8 = 2;
pub const KIND_COUNT : u8 = 3;

; Arguments each kind needs at least.
pub const NEEDS_SAY : u8 = 0;
pub const NEEDS_ASK : u8 = 1;
pub const NEEDS_CALL : u8 = 1;

; A good reply: a tool call that carries one argument (the file to read).
pub const GOOD_KIND : u8 = 2;
pub const GOOD_ARGS : u8 = 1;
; A bad reply: a tool call that names no file.
pub const BAD_KIND : u8 = 2;
pub const BAD_ARGS : u8 = 0;
; A reply of a kind that does not exist.
pub const ODD_KIND : u8 = 3;

test the_three_kinds_are_numbered_in_a_row {
    assert KIND_SAY == 0;
    assert KIND_ASK == 1;
    assert KIND_CALL == 2;
    assert KIND_COUNT == KIND_CALL + 1;
}

test a_sentence_needs_no_argument {
    assert NEEDS_SAY == 0;
}

test the_good_reply_has_enough_arguments {
    assert GOOD_KIND == KIND_CALL;
    assert GOOD_ARGS >= NEEDS_CALL;
}

; The negative control. The bad reply carries no argument and must be refused: it has fewer
; arguments than a call needs. Plant the bug by setting NEEDS_CALL to 0: this test turns red.
test the_bad_reply_is_refused {
    assert BAD_KIND == KIND_CALL;
    assert BAD_ARGS < NEEDS_CALL;
}

test an_unknown_kind_is_refused {
    assert ODD_KIND >= KIND_COUNT;
}

Открыть спеку урока в плеере ↗

Все уроки