72 lines
3.3 KiB
TypeScript
72 lines
3.3 KiB
TypeScript
import { HelpText } from './HelpText';
|
||
import { FieldLabel, FieldInput } from './formUtils';
|
||
import type { SectionFormProps } from './types';
|
||
|
||
export function SafetyForm({ config, onChange }: SectionFormProps) {
|
||
const safety = config.safety ?? {};
|
||
const historySummarization = safety.historySummarization ?? {};
|
||
|
||
return (
|
||
<div className="space-y-5">
|
||
<h2 className="text-base font-semibold text-slate-800">Safety</h2>
|
||
|
||
<div>
|
||
<FieldLabel>Max Iterations</FieldLabel>
|
||
<FieldInput type="number" value={safety.maxIterations ?? 200}
|
||
onChange={v => onChange('safety.maxIterations', Number(v))} />
|
||
<HelpText>1 movement あたりの最大イテレーション回数。デフォルト: 200</HelpText>
|
||
</div>
|
||
|
||
<div>
|
||
<FieldLabel>Max Revisits</FieldLabel>
|
||
<FieldInput type="number" value={safety.maxRevisits ?? 3}
|
||
onChange={v => onChange('safety.maxRevisits', Number(v))} />
|
||
<HelpText>同一 movement への再訪問上限(ループ検出)。デフォルト: 3</HelpText>
|
||
</div>
|
||
|
||
<div>
|
||
<FieldLabel>Max Tool Loop Repeats</FieldLabel>
|
||
<FieldInput type="number" value={safety.maxToolLoopRepeats ?? 5}
|
||
onChange={v => onChange('safety.maxToolLoopRepeats', Number(v))} />
|
||
<HelpText>同一 movement 内で全く同じツール呼び出し(ツール名+引数)を連続で繰り返した回数がこの値に達したら、ループとみなして強制中断する(2以上、デフォルト: 5)。手前で1回エージェントに警告を注入する</HelpText>
|
||
</div>
|
||
|
||
<div>
|
||
<FieldLabel>Prompt Guard Ratio</FieldLabel>
|
||
<FieldInput type="number" value={safety.promptGuardRatio ?? 0.8}
|
||
onChange={v => onChange('safety.promptGuardRatio', v ? Number(v) : undefined)} />
|
||
<HelpText>送信前に prompt がコンテキスト上限の何割を占めたら自動圧縮するか(0.5〜0.95、デフォルト: 0.8)</HelpText>
|
||
</div>
|
||
|
||
<h3 className="text-sm font-medium text-slate-600 mt-4 pt-3 border-t border-slate-200">History Summarization</h3>
|
||
|
||
<div>
|
||
<label className="flex items-center gap-2 text-sm text-slate-700">
|
||
<input
|
||
type="checkbox"
|
||
checked={historySummarization.enabled !== false}
|
||
onChange={e => onChange('safety.historySummarization.enabled', e.target.checked)}
|
||
className="rounded"
|
||
/>
|
||
履歴の自動要約を有効化
|
||
</label>
|
||
<HelpText>古い会話履歴を自動で要約して context を節約。デフォルト: 有効</HelpText>
|
||
</div>
|
||
|
||
<div>
|
||
<FieldLabel>Tail Turns</FieldLabel>
|
||
<FieldInput type="number" value={historySummarization.tailTurns ?? 2}
|
||
onChange={v => onChange('safety.historySummarization.tailTurns', Number(v))} />
|
||
<HelpText>常に保持する直近の assistant+tool ターン数。デフォルト: 2</HelpText>
|
||
</div>
|
||
|
||
<div>
|
||
<FieldLabel>Preserve Recent Budget</FieldLabel>
|
||
<FieldInput type="number" value={historySummarization.preserveRecentBudget ?? 8000}
|
||
onChange={v => onChange('safety.historySummarization.preserveRecentBudget', Number(v))} />
|
||
<HelpText>要約せず温存する直近メッセージのトークン予算。デフォルト: 8000</HelpText>
|
||
</div>
|
||
</div>
|
||
);
|
||
}
|