fix(opencode): reasoning-fallback в вердикте + API-логи в debug-уровень
- verdict(): если в завершённом assistant-сообщении нет text-парта, но есть reasoning — вердикт собирается из reasoning (fallback), а не падает с 'нет text-части в ответе'. Решает сбой dev/reviewer/postmortem на моделях, отвечающих только thinking (например, через прокси tokentool). - Отладочные логи API-вызовов (запрос/ответ) помечены маркером 'debug', чтобы в панели «Логи» они классифицировались как debug, а не info.
This commit is contained in:
@@ -110,6 +110,28 @@ func TestRun_ReasoningGrowth(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestRun_ReasoningOnlyVerdict(t *testing.T) {
|
||||
t.Setenv("XDG_CONFIG_HOME", t.TempDir())
|
||||
dir := t.TempDir()
|
||||
// завершённый ответ без text-парта, только reasoning — вердикт собирается
|
||||
// из reasoning (fallback) вместо ошибки «нет text-части в ответе».
|
||||
f := &fakeAPIServer{verdictReasoning: "размышления без текста"}
|
||||
p, _ := fakePool(t, f, dir)
|
||||
|
||||
r := &Runner{Pool: p, IdleTimeout: time.Minute, HardTimeout: time.Minute,
|
||||
PollInterval: 5 * time.Millisecond, Stdout: io.Discard}
|
||||
res, err := r.Run(context.Background(), "task", dir, "dev", "")
|
||||
if err != nil {
|
||||
t.Fatalf("Run err: %v", err)
|
||||
}
|
||||
if res.RC != 0 {
|
||||
t.Errorf("RC = %d, want 0 (reasoning-only вердикт)", res.RC)
|
||||
}
|
||||
if !contains(res.Stdout, "размышления без текста") {
|
||||
t.Errorf("Stdout = %q, want reasoning fallback", res.Stdout)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRun_ContextCancel(t *testing.T) {
|
||||
t.Setenv("XDG_CONFIG_HOME", t.TempDir())
|
||||
dir := t.TempDir()
|
||||
|
||||
Reference in New Issue
Block a user