Context inspector
Không phải phase của v1. Follow-up này bắt đầu sau khi đã có trang web admin, vì giao diện chính của nó là một bảng checkbox trên trang đó. Nó cần mọi phase v1 mà nó dựa vào đã xong: chain của phase 7, compaction và estimator của phase 10, memory và skills của phase 11, và usage records của phase 13.
Tổng quan
Cho thấy chính xác hango gửi gì đến model cho một session, từng phần một, và cho phép người dùng bỏ bớt các phần. Một request model được ghép từ nhiều nguồn: system prompt của agent, các block mà mỗi middleware đóng góp (planning, filesystem, subagent, memory, chỉ mục skills), bản tóm tắt compaction, mọi message trong lịch sử và mọi định nghĩa tool. Sau phase 11 không ai thấy được việc ghép này nếu không đọc Langfuse, và không ai thay đổi được nó nếu không sửa code. Follow-up này thêm bốn thứ lên trên chain của phase 7: một endpoint inspect trả về request model kế tiếp của một session dưới dạng danh sách các phần có gắn nhãn kèm ước lượng token, các override được lưu để loại bỏ hoặc thay thế các phần ở những lần gọi model sau, một endpoint try gửi một lần gọi model với các phần loại bỏ tạm thời và trả về câu trả lời mà không đụng đến session, và một bảng trên trang web admin hiển thị các phần, mỗi phần có một checkbox.
Ý tưởng đến từ bảng “Optimize context” của AICoworker và được ghi là A4 trong plans/reports/research-261014-1634-aicoworker-goclaw-hango-comparison.md. AICoworker là một gateway: nó bắt các request trên đường đến provider và nhóm chúng theo API key và cuộc hội thoại. hango là harness, nên nó không cần bắt gì cả. Nó tự xây request, nên chain chỉ cần nhớ mỗi phần đến từ đâu.
Yêu cầu
Chức năng
- Mỗi phần của một request model đã ghép có một part id ổn định, giữ nguyên qua các turn và các run:
system:<contributor>cho các block mà một contributor thêm vào, ví dụsystem:agent,system:todo,system:filesystem,system:skills, vàsystem:memory:/memories/AGENTS.mdcho một nguồn memory.tool:<name>cho một định nghĩa tool.message:<seq>cho một message đã lưu, vàsummarycho bản tóm tắt compaction của phase 10.
GET /v1/sessions/{id}/contexttrả về những gì lần gọi model kế tiếp của session sẽ gửi. Nó tạo một run state mới giống như một run mới, chạyBeforeRun, ghép system block, tool và message qua chain thật, và dừng ở một capture handler thay vì provider. Không có gì được ghi và không model nào được gọi. Response nhóm các phần thànhsystem,toolsvàmessages. Mỗi phần có id, kind, label, một bản xem trước 200 ký tự, một ước lượng token,included(false khi một override loại bỏ nó), vàoverride(exclude,replacehoặc không có).?full=<part id>trả về toàn bộ nội dung của một phần. Tổng được cho cả trước và sau override.- Ước lượng token cho từng phần dùng
Estimatorcủa phase 10. Tổng của request dùngTokenCountercủa provider khi provider có, và dùng ước lượng trong trường hợp còn lại; response cho biết đã dùng cách nào. - Khi lần gọi kế tiếp sẽ kích hoạt summarization, response inspect báo điều đó bằng
would_compact: truevà hiển thị các message như hiện tại. Một request inspect không bao giờ gọi summarizer. PUT /v1/agents/{id}/context-overridesthay thế các override của agent cho các phầnsystem:*vàtool:*. Chúng áp dụng cho mọi session của agent.PUT /v1/sessions/{id}/context-overridesthay thế các override của session cho các phầnmessage:*vàsummary. Mỗi override là{part, action, replacement}vớiactionlàexcludehoặcreplace.GETtrên cả hai path trả về tập hiện tại. Một danh sách rỗng sẽ xóa nó.replaceđược phép cho các phần system và message, và bị từ chối với 422 cho các phần tool, vì một schema tool đã đổi sẽ không còn khớp với việc kiểm tra argument của tool.- Override được nạp một lần mỗi run trong
BeforeRun, nên một thay đổi áp dụng từ run kế tiếp. Một run không bao giờ thấy context của nó đổi giữa các turn. - Một tập override phải để lại một request hợp lệ. Loại bỏ một message chứa
tool_usecũng loại bỏ message chứatool_resultcủa nó, và ngược lại. Response của PUT liệt kê mọi phần được thêm vào theo cách này. Một tập sẽ không còn message user nào, hoặc sẽ làm lịch sử bắt đầu bằng một message assistant, bị từ chối với 422 kèm lý do. Việc kiểm tra dùng lại validator sau compaction của phase 10. - Một override cho một phần không còn tồn tại (một file memory đã xóa, một tool đã bỏ khỏi agent) vẫn được giữ và endpoint inspect báo là
stale: true. Nó không làm gì cho đến khi phần đó quay lại. POST /v1/sessions/{id}/context/trynhận{exclude: [...], replace: {...}, message: "đoạn text user thêm, không bắt buộc"}, áp dụng các override đã lưu cộng với các override trong body, gửi một lần gọi model và trả về message assistant, stop reason và usage. Các tool call trong câu trả lời được trả về, không được thực thi. Không có gì được thêm vào session và không run nào được tạo. Lần gọi có timeout (HANGO_CONTEXT_TRY_TIMEOUT, mặc định 120s).hango context show --session <id>in response inspect thành một bảng theo nhóm: một cột checkbox, part id, label, bản xem trước và token, kèm tổng của từng nhóm.hango context exclude --session <id> <part>...,hango context include ...vàhango context try --session <id> [--exclude <part>...] [--message <text>]bọc các endpoint còn lại. Giốnghango eval, lệnh này là một HTTP client của API công khai của hango và đọcHANGO_API_URLvàHANGO_API_KEY.- Trang web admin có một bảng “Context” cho một session. Nó hiển thị ba nhóm, system, tools và messages, với một checkbox, label, bản xem trước và số token cho mỗi phần, tổng của từng nhóm, và tổng trước và sau override. Bấm vào một phần sẽ mở toàn bộ nội dung của nó, và một phần system hoặc message có thể được sửa, việc này lưu một override
replace. Bỏ chọn hoặc chọn các phần rồi bấm Save sẽ gửi PUT cho agent hoặc session. Nút “Try” gửi lựa chọn hiện tại đến endpoint try và hiển thị câu trả lời cạnh bảng. Các phần được thêm vào vì là cặp đi kèm, các override stale,cached_prefixvàwould_compactđược hiển thị dưới dạng nhãn. Bảng chỉ dùng HTTP API ở trên, giống mọi màn hình khác của trang web admin.
Phân quyền
| Route | Owner | Admin | Member |
|---|---|---|---|
GET /v1/sessions/{id}/context | mọi session trong tenant | mọi session trong tenant | chỉ session của mình |
GET/PUT /v1/sessions/{id}/context-overrides | mọi session trong tenant | mọi session trong tenant | chỉ session của mình |
POST /v1/sessions/{id}/context/try | mọi session trong tenant | mọi session trong tenant | chỉ session của mình |
GET/PUT /v1/agents/{id}/context-overrides | mọi agent trong tenant | mọi agent trong tenant | chỉ agent của mình |
Các dòng này theo GET /v1/sessions/{id}/messages và PATCH /v1/agents/{id} từ phase 4: ai được đọc message của một session thì được xem context của nó, và ai được thay đổi một agent thì được thay đổi override của nó. Một đối tượng ở tenant khác hoặc của member khác trả về 404.
Phi chức năng
- Override không bao giờ thay đổi lịch sử đã lưu. Giống compaction ở phase 10, chúng chỉ tác động lên request gửi đi.
- Endpoint inspect và try trả nội dung message và memory cho người gọi API, đúng nội dung mà
GET /v1/sessions/{id}/messagesđã trả về. Chúng không bao giờ đưa nội dung lên span hoặc log. Nội dung trên telemetry vẫn dotenants.trace_llm_contentkiểm soát như trước. - Loại bỏ hoặc thay thế một phần system làm đổi phần đầu của prompt, nên lần gọi kế tiếp sẽ trượt prompt cache. Response inspect đánh dấu các phần nằm trước cache breakpoint bằng
cached_prefix: trueđể người dùng thấy được cái giá phải trả. - Một lần gọi try là một lần gọi model thật. Nó được ghi vào
usage_recordsvới purposecontext_tryvà không có run, và tính vào quota của tenant và rate limit của API key như mọi lần gọi khác. Migration của follow-up này mở rộng điều kiện check củapurposevớicontext_tryvà cho phépusage_records.run_idnhận null. - Một request inspect tốn một lần ghép chain và không có lần gọi model nào. Độ trễ của nó bị giới hạn bởi
BeforeRun, mà phase 11 đã đặt giới hạn. - Không thêm Go package mới. Middleware override và part id nằm trong
internal/agent, handler tronginternal/server, store tronginternal/store/pg, và CLI trongcmd/hango. Bảng nằm trong cây mã nguồn của trang web admin.
Kiến trúc
// internal/agent/parts.go
type PartID string // "system:memory:/memories/AGENTS.md", "tool:read_file", "message:42", "summary"
type Part struct {
ID PartID
Kind string // "system", "tool", "message", "summary"
Label string
Tokens int
}
// SourcedBlock giữ nguồn gốc cạnh block. provider.Block không đổi,
// nên không có gì riêng của hango bị serialize sang provider.
type SourcedBlock struct {
Part PartID
Block provider.Block
}
// internal/agent/chain.go — SystemBlocks giữ vai trò cũ nhưng trả về nguồn gốc.
func (c *Chain) SystemBlocks(def store.Agent, s *State) []SourcedBlock
// internal/agent/mwoverrides.go
type Override struct {
Part PartID
Action string // "exclude" hoặc "replace"
Replacement string
}
type ContextOverridesMiddleware struct {
Store store.ContextOverrides
} // RunHook (nạp override của agent và session một lần) + ModelWrapper (message và summary)
// internal/agent/inspect.go
type Snapshot struct {
System, Tools, Messages []Part
WouldCompact bool
TotalBefore, TotalAfter int
Counted string // "provider" hoặc "estimate"
}
// Inspect ghép request kế tiếp của một session qua chain thật và một
// capture handler. Nó không bao giờ gọi provider hoặc summarizer.
func Inspect(ctx context.Context, deps Deps, sessionID uuid.UUID, extra []Override) (*Snapshot, *provider.Request, error)Mỗi override được áp dụng ở đâu:
- Các phần system bị bỏ hoặc thay thế bên trong
Chain.SystemBlocks, trước khiPromptCacheMiddlewarechọn chỉ số breakpoint, nên breakpoint rơi vào một block thực sự được gửi. - Các phần tool bị bỏ ở slot
ToolAllowlist, slot cuối cùng trong stack, nên không middleware nào sau đó thêm lại được một tool đã bị loại bỏ. - Các phần message và summary bị bỏ hoặc thay thế bởi
ContextOverridesMiddleware, một slot mới ngay trước Summarization, nên compaction và ngân sách token thấy lịch sử đã được lọc.
-- migrations/NNNNN_context_overrides.sql (số migration còn trống kế tiếp)
create table context_overrides (
id uuid primary key,
tenant_id uuid not null references tenants(id) on delete cascade,
agent_id uuid references agents(id) on delete cascade,
session_id uuid references sessions(id) on delete cascade,
part text not null,
action text not null check (action in ('exclude','replace')),
replacement text,
created_by uuid not null references users(id),
created_at timestamptz not null default now(),
check (num_nonnulls(agent_id, session_id) = 1),
check ((action = 'replace') = (replacement is not null)),
check (agent_id is null or part like 'system:%' or part like 'tool:%'),
check (session_id is null or part like 'message:%' or part = 'summary')
);
-- cùng migration này mở rộng usage_records cho các lần gọi try
alter table usage_records alter column run_id drop not null;
-- và thay điều kiện check của purpose để cho phép thêm 'context_try'
create unique index context_overrides_agent_part_idx on context_overrides (tenant_id, agent_id, part) where agent_id is not null;
create unique index context_overrides_session_part_idx on context_overrides (tenant_id, session_id, part) where session_id is not null;Một PUT xóa các dòng của đối tượng và chèn tập mới trong một transaction. Các query nằm trong internal/store/pg/queries/context_overrides.sql và đi qua sqlc giống mọi bảng khác kể từ phase 2.1.
Instrumentation
- Span
agent.context_inspectcho một request inspect, vớihango.context.parts.system,hango.context.parts.tools,hango.context.parts.messages,hango.context.tokens.before,hango.context.tokens.after,hango.context.would_compact. - Attribute trên mọi span
chat:hango.context.overrides(số override đang hoạt động) vàhango.context.excluded_tokens. Khi đó một run có context bị sửa tay sẽ hiện ra trong Tempo và Langfuse, giúp trả lời “vì sao agent quên X” trước khi ai đó nghi ngờ model. - Span event
agent.context_override_stalecho mỗi override mà phần của nó không còn tồn tại, vàagent.context_override_pairedkhi một phần đi cặptool_use/tool_resultbị loại bỏ cùng cặp của nó. - Một lần gọi try là một span
chatbình thường vớihango.context.try = truenằm dưới một span SERVERcontext_try, nên nó xuất hiện trong Langfuse cạnh các generation bình thường nhưng có thể lọc ra. - Metric: histogram
hango.context.inspect.duration, counterhango.context.try(attributeoutcome), gaugehango.context.overrides.activetheo tenant. - Audit action, thêm vào tập đóng từ phase 2:
context.overridecho cả hai route PUT (loại đối tượngagenthoặcsession,detailchứa các part id và action, không bao giờ chứa text thay thế) vàcontext.try(detailchứa các part id bị loại bỏ và model).
Các file liên quan
Tạo mới
migrations/NNNNN_context_overrides.sql, dùng số migration còn trống kế tiếp khi follow-up này bắt đầu.internal/store/pg/queries/context_overrides.sql,internal/store/pg/context_overrides.go, và các case cô lập tronginternal/store/pg/tenancy_test.go.internal/agent/parts.go,internal/agent/parts_test.go— part id, label, bản xem trước.internal/agent/mwoverrides.go,internal/agent/mwoverrides_test.go.internal/agent/inspect.go,internal/agent/inspect_test.go.internal/server/handlers_context.go,internal/server/handlers_context_test.go.cmd/hango/context.go,cmd/hango/context_test.go.docs/learning/context-inspector.md.- Component bảng Context và API client của nó trong trang web admin.
Sửa đổi
internal/store/store.go— sub-storeContextOverridestrênScoped.internal/agent/chain.go—SystemBlockstrả về[]SourcedBlock, áp dụng override system, và base handler bỏ thông tin nguồn gốc trước khi xâyprovider.Request.System.internal/agent/mwstack.go,internal/agent/mwstack_test.go— slot ContextOverrides trước Summarization; test thứ tự kiểm tra điều này.internal/agent/mwallowlist.go— bỏ các tool bị loại bỏ.internal/agent/mwcache.go— chọn chỉ số breakpoint sau khi đã áp dụng override system.internal/agent/mwsummarize.go— trong một lần gọi chỉ để capture, báowould_compactmà không gọi summarizer.- Mọi
PromptContributor(mwtodo.go,mwfilesystem.go,mwsubagent.go,mwmemory.go,mwskills.go) — gắn part id của nó cho các block của nó. internal/server/authz.go,internal/server/authz_test.go— năm dòng route ở trên.internal/store/audit.go—context.overridevàcontext.trytrong tập action.internal/config/config.go—HANGO_CONTEXT_TRY_TIMEOUT.internal/usagevà store của nó — purposecontext_tryvà các record không có run.internal/telemetry/attrs.go,internal/telemetry/metrics_names.go— các tên ở trên.docs/system-architecture.md,docs/learning/README.md,docs/roadmap.md.
Các bước triển khai
- Viết migration (bảng cộng với thay đổi
usage_records), file query và scoped store vớiList(target)vàReplace(target, []Override)trong một transaction. Thêm các case cô lập giữa các tenant và trong cùng tenant chocontext_overridesvào bảng cô lập. - Viết
parts.go: hàm tạo và phân tích part id, label cho từng loại (tên tool,#seq role, path memory), và một bản xem trước cắt ở 200 ký tự đúng ranh giới rune. - Đổi
Chain.SystemBlocksđể trả về[]SourcedBlockvà gắn nhãn các block của mọi contributor hiện có. Cho base handler bỏ thông tin nguồn gốc. Mọi test chain và test thứ tự hiện có phải qua mà không đổi gì ngoài kiểu dữ liệu. - Viết
mwoverrides.go:BeforeRunnạp override của agent và session vào state riêng có kiểu.WrapModelCallbỏ và thay các phần message và summary, rồi chạy validator cặp của phase 10 trên kết quả. Nếu kiểm tra thất bại ở đây nghĩa là tập đã lưu bị hỏng sau khi lưu (một message mới hơn làm đổi việc ghép cặp); khi đó middleware gửi request không kèm các override message, ghi log mức error và ghi một span event. Nó không bao giờ gửi một request không hợp lệ. - Áp dụng override system trong
SystemBlockstrước khi chọn cache breakpoint, và override tool trong slot allowlist. Thêm slot ContextOverrides vàoDefaultStackvà vào test thứ tự. - Viết
inspect.go: xây chain cho agent của session, chạyBeforeRuntrên một state mới tạo từ các message đã lưu, gọiModelCallvới một capture handler, và biến request bắt được thành mộtSnapshot. Đánh dấu lần gọi summarizer là chỉ capture để nó báowould_compactthay vì gọi model. - Viết
handlers_context.go: các route inspect, overrides và try với các dòng phân quyền và audit action của chúng. PUT overrides kiểm tra tập dựa trên lịch sử hiện tại, thêm các phần đi cặp, và trả về tập đã lưu cộng các phần được thêm. Route try chạyInspectvới các override thêm, gửi request bắt được qua provider với timeout, và trả về câu trả lời. - Viết
cmd/hango/context.govớishow,exclude,includevàtry. - Xây bảng Context trong trang web admin trên cùng các route.
- Thêm instrumentation và bước runbook, rồi viết test và tài liệu học.
Dàn ý tài liệu học
docs/learning/context-inspector.md phải có:
- Khái niệm: một request model được ghép lại, không phải được viết ra. Mỗi phần đến từ đâu, mỗi phần tốn bao nhiêu, và vì sao “model thực sự đã thấy gì?” là câu hỏi debug đầu tiên cho một câu trả lời tệ.
- Các lựa chọn thiết kế: gắn nguồn gốc lên block thay vì phân tích prompt sau đó; xem trước bằng cách ghép thử qua chain thật thay vì một đường ghép thứ hai có thể lệch đi; override nạp một lần mỗi run; override cấp agent cho system và tool, cấp session cho message; từ chối replace cho tool.
- Vì sao override phải giữ request hợp lệ: việc ghép cặp
tool_use/tool_result, một lịch sử bắt đầu bằng message user, và provider làm gì khi một trong hai quy tắc bị phá. - Cái giá của việc sửa phần đầu prompt: prompt cache, và vì sao response đánh dấu
cached_prefix. - Đánh đổi: xem trước lần gọi kế tiếp so với lưu bản sao của mọi lần gọi đã qua (dung lượng, quyền riêng tư của message gia đình, Langfuse đã giữ quá khứ khi bật trace nội dung); override đã lưu so với các lần thử một lần; bảng trên trang web admin so với bảng trong CLI.
- So sánh với AICoworker: một gateway bắt từng request, nhóm theo API key và cuộc hội thoại, áp dụng các phần system và tool bị bỏ chọn cho mọi cuộc hội thoại của key và các message bị bỏ chọn cho một cuộc hội thoại, và cho phép người dùng xem và sửa từng phần. hango giữ cách nhóm tương tự với agent thay cho API key, và thêm việc kiểm tra cặp và dấu cache.
- So sánh với goclaw:
GET /v1/agents/{id}/system-prompt-previewtronginternal/http/agents_prompt_preview.gorender system prompt cho một prompt mode với các section có tên, một số đếm token và danh sách tool. Nó chỉ đọc và chỉ bao gồm system prompt. - So sánh với deepagents: thư viện không có inspector; LangSmith hiển thị input của từng lần gọi model sau khi đã xảy ra.
- Cách debug lớp này: một phần không có trong response inspect nghĩa là contributor của nó chưa gắn nhãn (kiểm tra part id của contributor); một run hành xử khác với bản xem trước nghĩa là override đã đổi sau khi run bắt đầu (override nạp ở
BeforeRun); một lần trượt cache bất ngờ sau một override hiện ra dưới dạng sụt giảmhango.cache.read_ratiocùng vớihango.context.overridestrên spanchat; một override stale hiện ra dưới dạngagent.context_override_stale. - Bài tập: loại bỏ chỉ mục skills và hỏi agent về một skill; loại bỏ một tool result cũ và xem phần đi cặp bị loại theo; dùng
tryđể so sánh một câu trả lời có và không có memory. - Ngân sách thời gian: 9h cho API, store và CLI + 4h cho bảng trên trang web admin + 2h tài liệu học.
Tiêu chí thành công
-
go build ./... && go vet ./... && go test -race ./...đều qua khi Docker đang chạy, vàgolangci-lint runbáo 0 lỗi. - Response inspect của một session liệt kê mọi system contributor, mọi tool và mọi message của request kế tiếp, và tổng ước lượng của các phần bằng
Estimator.EstimateRequesttrên request bắt được (test). - Một request inspect không gọi provider lẫn summarizer, và không ghi dòng nào (test với một provider giả báo lỗi ở bất kỳ lần gọi nào).
- Khi
message:5bị loại bỏ trên một session, lần gọi model kế tiếp của một run mới trong session đó không chứa message 5, vàGET /v1/sessions/{id}/messagesvẫn trả về nó (integration test). - Loại bỏ message có
tool_usecũng loại bỏ message cótool_resultcủa nó, và response PUT liệt kê phần được thêm (test). - Một tập override không còn message user nào bị từ chối với 422 (test).
-
replacetrên một phầntool:*bị từ chối với 422 (test). - Một tool bị loại bỏ không có trong danh sách tool của request ngay cả khi
allowed_toolscủa một skill có nêu tên nó (test). - Chỉ số cache breakpoint rơi vào một block được gửi khi một phần system đứng trước nó bị loại bỏ (test).
- Một lần gọi try trả về câu trả lời, không thêm message nào và không tạo run nào, và span
chatcủa nó manghango.context.try = true(test). - Mọi dòng route trong bảng phân quyền đều được bao phủ, gồm cả trường hợp một member đọc context session của member khác (404) và một member thay đổi override agent của member khác (404).
- Các case cô lập giữa các tenant và trong cùng tenant cho
context_overridesđều qua. - Cả hai route PUT ghi một dòng audit
context.overridevà route try ghicontext.try; không có text thay thế nào xuất hiện trongdetail(test). -
hango context show --session <id>in bảng theo nhóm khi chạy với một server thật. - Một lần gọi try ghi một dòng
usage_recordsvới purposecontext_tryvà không có run, và bị từ chối với 402 khi quota của tenant đã hết (test). - Trên trang web admin, bỏ chọn một message rồi lưu sẽ loại nó khỏi run kế tiếp, và tổng trên bảng thay đổi khớp với response inspect.
- Trong Tempo, một run có override đang hoạt động hiển thị
hango.context.overridestrên các spanchatcủa nó.
Đánh giá rủi ro
| Rủi ro | Khả năng x Tác động | Dấu hiệu | Phản ứng định sẵn |
|---|---|---|---|
| Bản xem trước inspect lệch khỏi những gì một run gửi | Trung bình x Cao | Span chat của một run cho số phần khác với bản xem trước | Inspect dùng chain thật và một capture handler, không bao giờ dùng đường ghép thứ hai; một test so sánh bản xem trước với request mà một provider giả nhận được |
| Một override làm hỏng request và provider trả về 400 | Trung bình x Cao | Provider trả 400 trên một session có override | Các phần đi cặp bị loại bỏ cùng nhau, tập được kiểm tra khi PUT và lại khi gửi; một tập thất bại lúc gửi sẽ bị bỏ qua, không được gửi |
| Người dùng loại bỏ một phần rồi quên, sau đó agent có vẻ bị hỏng | Cao x Trung bình | Than phiền về chuyện “quên” | hango.context.overrides trên mọi span chat và một dòng trong output inspect liệt kê các override đang hoạt động; follow-up này thêm một bước runbook kiểm tra override đầu tiên |
| Override trên các phần system làm sụp prompt cache | Trung bình x Trung bình | hango.cache.read_ratio giảm sau một override | Dấu cached_prefix trong response; tài liệu học giải thích cái giá |
| Part id đổi khi một contributor bị đổi tên | Thấp x Trung bình | Override stale sau một lần nâng cấp | Part id là hằng số đặt cạnh mỗi contributor với một test cố định chúng; một override stale được báo ra, không bao giờ âm thầm áp dụng chỗ khác |
Một lịch sử có tool_use của một tool đã bị loại bỏ bị provider từ chối | Thấp x Trung bình | Provider trả 400 nêu tên một tool không biết | Có test với provider giả; nếu provider thật từ chối, PUT overrides từ chối việc loại bỏ tool khi lịch sử vẫn còn lời gọi đến tool đó |
Rollback
goose down một bước sẽ xóa context_overrides và khôi phục các ràng buộc của usage_records (sau khi xóa các dòng context_try). Bỏ slot ContextOverrides khỏi DefaultStack và bỏ bộ lọc tool khỏi slot allowlist sẽ khôi phục hành vi trước follow-up này. Thông tin nguồn gốc trên các system block có thể giữ lại, vì nó không bao giờ được gửi đi. Ẩn bảng trên trang web admin sẽ gỡ phần giao diện.