niceeval 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INDEX.md +4 -2
- package/dist/adapter-usage.cjs.map +1 -1
- package/dist/adapter-usage.d.cts +1 -1
- package/dist/adapter-usage.d.mts +1 -1
- package/dist/adapter-usage.d.ts +1 -1
- package/dist/adapter.cjs +8 -7
- package/dist/adapter.cjs.map +1 -1
- package/dist/adapter.d.cts +21 -21
- package/dist/adapter.d.mts +21 -21
- package/dist/adapter.d.ts +21 -21
- package/dist/agents/{effect-runtime.cjs → agent-effects.cjs} +12 -18
- package/dist/agents/agent-effects.cjs.map +1 -0
- package/dist/agents/agent-effects.d.cts +23 -0
- package/dist/agents/agent-effects.d.mts +23 -0
- package/dist/agents/agent-effects.d.ts +23 -0
- package/dist/agents/agent-effects.js +16 -0
- package/dist/agents/agent-effects.js.map +1 -0
- package/dist/agents/ai-sdk.cjs +1 -1
- package/dist/agents/ai-sdk.cjs.map +1 -1
- package/dist/agents/bub.cjs +31 -18
- package/dist/agents/bub.cjs.map +1 -1
- package/dist/agents/bub.d.cts +9 -12
- package/dist/agents/bub.d.mts +9 -12
- package/dist/agents/bub.d.ts +9 -12
- package/dist/agents/claude-code-native.cjs +2 -2
- package/dist/agents/claude-code-native.cjs.map +1 -1
- package/dist/agents/claude-code.cjs +17 -11
- package/dist/agents/claude-code.cjs.map +1 -1
- package/dist/agents/claude-code.d.cts +11 -11
- package/dist/agents/claude-code.d.mts +11 -11
- package/dist/agents/claude-code.d.ts +11 -11
- package/dist/agents/codex-app-server.cjs +2 -2
- package/dist/agents/codex-app-server.cjs.map +1 -1
- package/dist/agents/codex.cjs +18 -12
- package/dist/agents/codex.cjs.map +1 -1
- package/dist/agents/codex.d.cts +12 -12
- package/dist/agents/codex.d.mts +12 -12
- package/dist/agents/codex.d.ts +12 -12
- package/dist/agents/deepseek-harness.cjs +2 -2
- package/dist/agents/deepseek-harness.cjs.map +1 -1
- package/dist/agents/hermes.cjs +3 -3
- package/dist/agents/hermes.cjs.map +1 -1
- package/dist/agents/index.cjs +3 -3
- package/dist/agents/index.cjs.map +1 -1
- package/dist/agents/index.d.cts +3 -3
- package/dist/agents/index.d.mts +3 -3
- package/dist/agents/index.d.ts +3 -3
- package/dist/agents/index.js +2 -2
- package/dist/agents/index.mjs +2 -2
- package/dist/agents/mcp.cjs.map +1 -1
- package/dist/agents/mcp.d.cts +2 -2
- package/dist/agents/mcp.d.mts +2 -2
- package/dist/agents/mcp.d.ts +2 -2
- package/dist/agents/omp.cjs +2 -2
- package/dist/agents/omp.cjs.map +1 -1
- package/dist/agents/openai-compat.cjs +2 -2
- package/dist/agents/openai-compat.cjs.map +1 -1
- package/dist/agents/openclaw.cjs +3 -3
- package/dist/agents/openclaw.cjs.map +1 -1
- package/dist/agents/opencode.cjs +16 -4
- package/dist/agents/opencode.cjs.map +1 -1
- package/dist/agents/plugin-extensions.cjs +71 -0
- package/dist/agents/plugin-extensions.cjs.map +1 -0
- package/dist/agents/plugin-extensions.d.cts +26 -0
- package/dist/agents/plugin-extensions.d.mts +26 -0
- package/dist/agents/plugin-extensions.d.ts +26 -0
- package/dist/agents/plugin-extensions.js +8 -0
- package/dist/agents/plugin-extensions.js.map +1 -0
- package/dist/agents/post-setup.cjs +14 -3
- package/dist/agents/post-setup.cjs.map +1 -1
- package/dist/agents/post-setup.d.cts +4 -2
- package/dist/agents/post-setup.d.mts +4 -2
- package/dist/agents/post-setup.d.ts +4 -2
- package/dist/agents/post-setup.js +8 -6
- package/dist/agents/sdk-streams.cjs +3 -3
- package/dist/agents/sdk-streams.cjs.map +1 -1
- package/dist/agents/{session-slot.cjs → session-key.cjs} +4 -4
- package/dist/agents/session-key.cjs.map +1 -0
- package/dist/agents/session-key.d.cts +12 -0
- package/dist/agents/session-key.d.mts +12 -0
- package/dist/agents/session-key.d.ts +12 -0
- package/dist/agents/session-key.js +6 -0
- package/dist/agents/session-key.js.map +1 -0
- package/dist/agents/shared.cjs +2 -2
- package/dist/agents/shared.cjs.map +1 -1
- package/dist/agents/shared.d.cts +4 -4
- package/dist/agents/shared.d.mts +4 -4
- package/dist/agents/shared.d.ts +4 -4
- package/dist/agents/skills.cjs.map +1 -1
- package/dist/agents/skills.d.cts +3 -3
- package/dist/agents/skills.d.mts +3 -3
- package/dist/agents/skills.d.ts +3 -3
- package/dist/agents/types.cjs.map +1 -1
- package/dist/agents/types.d.cts +55 -54
- package/dist/agents/types.d.mts +55 -54
- package/dist/agents/types.d.ts +55 -54
- package/dist/agents/ui-message-stream.cjs +4 -4
- package/dist/agents/ui-message-stream.cjs.map +1 -1
- package/dist/agents/unrecognized-events.cjs +32 -0
- package/dist/agents/unrecognized-events.cjs.map +1 -0
- package/dist/agents/unrecognized-events.d.cts +8 -0
- package/dist/agents/unrecognized-events.d.mts +8 -0
- package/dist/agents/unrecognized-events.d.ts +8 -0
- package/dist/agents/unrecognized-events.js +6 -0
- package/dist/agents/unrecognized-events.js.map +1 -0
- package/dist/assertions/api.cjs.map +1 -1
- package/dist/assertions/api.d.cts +3 -0
- package/dist/assertions/api.d.mts +3 -0
- package/dist/assertions/api.d.ts +3 -0
- package/dist/assertions/collection.cjs +1 -1
- package/dist/assertions/collection.cjs.map +1 -1
- package/dist/assertions/judge.cjs +1 -1
- package/dist/assertions/judge.cjs.map +1 -1
- package/dist/assertions/match.cjs +52 -21
- package/dist/assertions/match.cjs.map +1 -1
- package/dist/assertions/match.d.cts +16 -5
- package/dist/assertions/match.d.mts +16 -5
- package/dist/assertions/match.d.ts +16 -5
- package/dist/assertions/match.js +96 -94
- package/dist/assertions/measurements.cjs +22 -6
- package/dist/assertions/measurements.cjs.map +1 -1
- package/dist/assertions/measurements.d.cts +8 -1
- package/dist/assertions/measurements.d.mts +8 -1
- package/dist/assertions/measurements.d.ts +8 -1
- package/dist/assertions/numeric.cjs +2 -0
- package/dist/assertions/numeric.cjs.map +1 -1
- package/dist/assertions/numeric.d.cts +1 -1
- package/dist/assertions/numeric.d.mts +1 -1
- package/dist/assertions/numeric.d.ts +1 -1
- package/dist/assertions/quantity.cjs +42 -0
- package/dist/assertions/quantity.cjs.map +1 -0
- package/dist/assertions/quantity.d.cts +18 -0
- package/dist/assertions/quantity.d.mts +18 -0
- package/dist/assertions/quantity.d.ts +18 -0
- package/dist/assertions/quantity.js +22 -0
- package/dist/assertions/quantity.js.map +1 -0
- package/dist/assertions/record/attachment.cjs +2 -0
- package/dist/assertions/record/attachment.cjs.map +1 -1
- package/dist/assertions/record/codec.cjs +5 -1
- package/dist/assertions/record/codec.cjs.map +1 -1
- package/dist/assertions/record/model.cjs.map +1 -1
- package/dist/assertions/record/model.d.cts +3 -1
- package/dist/assertions/record/model.d.mts +3 -1
- package/dist/assertions/record/model.d.ts +3 -1
- package/dist/assertions/runtime.cjs +11 -6
- package/dist/assertions/runtime.cjs.map +1 -1
- package/dist/cli/program.cjs +3 -0
- package/dist/cli/program.cjs.map +1 -1
- package/dist/context/assert-first.cjs +6 -4
- package/dist/context/assert-first.cjs.map +1 -1
- package/dist/context/assert-first.d.cts +9 -3
- package/dist/context/assert-first.d.mts +9 -3
- package/dist/context/assert-first.d.ts +9 -3
- package/dist/context/notes.cjs +47 -0
- package/dist/context/notes.cjs.map +1 -0
- package/dist/context/notes.d.cts +10 -0
- package/dist/context/notes.d.mts +10 -0
- package/dist/context/notes.d.ts +10 -0
- package/dist/context/notes.js +6 -0
- package/dist/context/notes.js.map +1 -0
- package/dist/context/send-failures.cjs +1 -7
- package/dist/context/send-failures.cjs.map +1 -1
- package/dist/context/send-failures.d.cts +2 -3
- package/dist/context/send-failures.d.mts +2 -3
- package/dist/context/send-failures.d.ts +2 -3
- package/dist/context/send-retry.cjs +0 -1
- package/dist/context/send-retry.cjs.map +1 -1
- package/dist/context/send-retry.d.cts +1 -2
- package/dist/context/send-retry.d.mts +1 -2
- package/dist/context/send-retry.d.ts +1 -2
- package/dist/context/session.cjs +10 -17
- package/dist/context/session.cjs.map +1 -1
- package/dist/context/session.d.cts +4 -10
- package/dist/context/session.d.mts +4 -10
- package/dist/context/session.d.ts +4 -10
- package/dist/define.cjs +88 -65
- package/dist/define.cjs.map +1 -1
- package/dist/define.d.cts +3 -3
- package/dist/define.d.mts +3 -3
- package/dist/define.d.ts +3 -3
- package/dist/eval/cli/contribution.cjs +1 -1
- package/dist/eval/cli/contribution.cjs.map +1 -1
- package/dist/eval/host/index.cjs +1 -1
- package/dist/eval/host/index.cjs.map +1 -1
- package/dist/eval/record/evaluation.cjs +1 -1
- package/dist/eval/record/evaluation.cjs.map +1 -1
- package/dist/eval/record/membership-provenance.d.cts +3 -3
- package/dist/eval/record/membership-provenance.d.mts +3 -3
- package/dist/eval/record/membership-provenance.d.ts +3 -3
- package/dist/eval/record/score.cjs +2 -2
- package/dist/eval/record/score.cjs.map +1 -1
- package/dist/eval/record/sealed-assertion.cjs +1 -1
- package/dist/eval/record/sealed-assertion.cjs.map +1 -1
- package/dist/eval/record/verdict.cjs +2 -2
- package/dist/eval/record/verdict.cjs.map +1 -1
- package/dist/expect/index.cjs +10 -1
- package/dist/expect/index.cjs.map +1 -1
- package/dist/expect/index.d.cts +3 -1
- package/dist/expect/index.d.mts +3 -1
- package/dist/expect/index.d.ts +3 -1
- package/dist/expect/index.js +92 -76
- package/dist/expect/index.mjs +92 -76
- package/dist/experiment/host/cli/contribution.cjs +52 -39
- package/dist/experiment/host/cli/contribution.cjs.map +1 -1
- package/dist/experiment/host/cli/contribution.d.cts +18 -4
- package/dist/experiment/host/cli/contribution.d.mts +18 -4
- package/dist/experiment/host/cli/contribution.d.ts +18 -4
- package/dist/experiment/host/cli/contribution.js +2 -2
- package/dist/experiment/host/cli/debug-protocol.cjs +2 -2
- package/dist/experiment/host/cli/debug-protocol.cjs.map +1 -1
- package/dist/experiment/host/cli/debug-protocol.d.cts +2 -2
- package/dist/experiment/host/cli/debug-protocol.d.mts +2 -2
- package/dist/experiment/host/cli/debug-protocol.d.ts +2 -2
- package/dist/experiment/host/cli/output-protocol.cjs +1 -1
- package/dist/experiment/host/cli/output-protocol.cjs.map +1 -1
- package/dist/experiment/host/cli/output-protocol.d.cts +2 -2
- package/dist/experiment/host/cli/output-protocol.d.mts +2 -2
- package/dist/experiment/host/cli/output-protocol.d.ts +2 -2
- package/dist/experiment/host/current.cjs +2 -2
- package/dist/experiment/host/current.cjs.map +1 -1
- package/dist/experiment/host/index.cjs +1 -1
- package/dist/experiment/host/index.cjs.map +1 -1
- package/dist/experiment/host/operations.cjs +21 -22
- package/dist/experiment/host/operations.cjs.map +1 -1
- package/dist/experiment/host/runtime.cjs +8 -9
- package/dist/experiment/host/runtime.cjs.map +1 -1
- package/dist/experiment/host/runtime.d.cts +3 -3
- package/dist/experiment/host/runtime.d.mts +3 -3
- package/dist/experiment/host/runtime.d.ts +3 -3
- package/dist/experiment/host/teardown.cjs +3 -3
- package/dist/experiment/host/teardown.cjs.map +1 -1
- package/dist/experiment/host/teardown.d.cts +3 -3
- package/dist/experiment/host/teardown.d.mts +3 -3
- package/dist/experiment/host/teardown.d.ts +3 -3
- package/dist/experiment/host/types.cjs.map +1 -1
- package/dist/experiment/host/types.d.cts +19 -19
- package/dist/experiment/host/types.d.mts +19 -19
- package/dist/experiment/host/types.d.ts +19 -19
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/dist/inspection/assertions.cjs +1 -1
- package/dist/inspection/assertions.cjs.map +1 -1
- package/dist/inspection/cli/contribution.cjs +8 -7
- package/dist/inspection/cli/contribution.cjs.map +1 -1
- package/dist/inspection/facts.cjs +4 -4
- package/dist/inspection/facts.cjs.map +1 -1
- package/dist/inspection/index.cjs +1 -5
- package/dist/inspection/index.cjs.map +1 -1
- package/dist/inspection/index.d.cts +1 -2
- package/dist/inspection/index.d.mts +1 -2
- package/dist/inspection/index.d.ts +1 -2
- package/dist/inspection/index.js +20 -26
- package/dist/inspection/lifecycle.cjs +7 -0
- package/dist/inspection/lifecycle.cjs.map +1 -0
- package/dist/inspection/lifecycle.d.cts +4 -0
- package/dist/inspection/lifecycle.d.mts +4 -0
- package/dist/inspection/lifecycle.d.ts +4 -0
- package/dist/inspection/lifecycle.js +6 -0
- package/dist/inspection/lifecycle.js.map +1 -0
- package/dist/inspection/notes.cjs +40 -0
- package/dist/inspection/notes.cjs.map +1 -0
- package/dist/inspection/notes.d.cts +12 -0
- package/dist/inspection/notes.d.mts +12 -0
- package/dist/inspection/notes.d.ts +12 -0
- package/dist/inspection/notes.js +8 -0
- package/dist/inspection/notes.js.map +1 -0
- package/dist/inspection/overview.cjs +12 -15
- package/dist/inspection/overview.cjs.map +1 -1
- package/dist/inspection/overview.d.cts +8 -6
- package/dist/inspection/overview.d.mts +8 -6
- package/dist/inspection/overview.d.ts +8 -6
- package/dist/inspection/planned-attempt.cjs +45 -0
- package/dist/inspection/planned-attempt.cjs.map +1 -0
- package/dist/inspection/planned-attempt.d.cts +109 -0
- package/dist/inspection/planned-attempt.d.mts +109 -0
- package/dist/inspection/planned-attempt.d.ts +109 -0
- package/dist/inspection/planned-attempt.js +24 -0
- package/dist/inspection/planned-attempt.js.map +1 -0
- package/dist/inspection/project-result.cjs +5 -5
- package/dist/inspection/project-result.cjs.map +1 -1
- package/dist/inspection/project-result.d.cts +58 -57
- package/dist/inspection/project-result.d.mts +58 -57
- package/dist/inspection/project-result.d.ts +58 -57
- package/dist/inspection/project-result.js +4 -4
- package/dist/inspection/project.cjs +3 -3
- package/dist/inspection/project.cjs.map +1 -1
- package/dist/inspection/protocol-values.cjs +1 -1
- package/dist/inspection/protocol-values.cjs.map +1 -1
- package/dist/inspection/protocol-values.d.cts +1 -1
- package/dist/inspection/protocol-values.d.mts +1 -1
- package/dist/inspection/protocol-values.d.ts +1 -1
- package/dist/inspection/protocol.cjs +8 -8
- package/dist/inspection/protocol.cjs.map +1 -1
- package/dist/inspection/protocol.d.cts +237 -219
- package/dist/inspection/protocol.d.mts +237 -219
- package/dist/inspection/protocol.d.ts +237 -219
- package/dist/inspection/public.cjs +1 -5
- package/dist/inspection/public.cjs.map +1 -1
- package/dist/inspection/public.d.cts +1 -2
- package/dist/inspection/public.d.mts +1 -2
- package/dist/inspection/public.d.ts +1 -2
- package/dist/inspection/public.js +14 -20
- package/dist/inspection/public.mjs +166 -129
- package/dist/inspection/query.cjs +1 -1
- package/dist/inspection/query.cjs.map +1 -1
- package/dist/inspection/results.cjs +61 -52
- package/dist/inspection/results.cjs.map +1 -1
- package/dist/inspection/results.d.cts +157 -140
- package/dist/inspection/results.d.mts +157 -140
- package/dist/inspection/results.d.ts +157 -140
- package/dist/inspection/select.cjs +33 -28
- package/dist/inspection/select.cjs.map +1 -1
- package/dist/inspection/source.cjs +1 -1
- package/dist/inspection/source.cjs.map +1 -1
- package/dist/inspection/sources.cjs +2 -2
- package/dist/inspection/sources.cjs.map +1 -1
- package/dist/inspection/trace.cjs +9 -8
- package/dist/inspection/trace.cjs.map +1 -1
- package/dist/inspection/trace.d.cts +4 -4
- package/dist/inspection/trace.d.mts +4 -4
- package/dist/inspection/trace.d.ts +4 -4
- package/dist/loaders/index.cjs +7 -279
- package/dist/loaders/index.cjs.map +1 -1
- package/dist/loaders/index.d.cts +2 -95
- package/dist/loaders/index.d.mts +2 -95
- package/dist/loaders/index.d.ts +2 -95
- package/dist/loaders/index.js +10 -12
- package/dist/loaders/index.mjs +10 -12
- package/dist/loaders/runtime.cjs +283 -0
- package/dist/loaders/runtime.cjs.map +1 -0
- package/dist/loaders/runtime.d.cts +95 -0
- package/dist/loaders/runtime.d.mts +95 -0
- package/dist/loaders/runtime.d.ts +95 -0
- package/dist/loaders/runtime.js +16 -0
- package/dist/loaders/runtime.js.map +1 -0
- package/dist/migrations/judge-provider.md +6 -6
- package/dist/{model-slots.cjs → model-roles.cjs} +12 -12
- package/dist/{model-slots.cjs.map → model-roles.cjs.map} +1 -1
- package/dist/{model-slots.d.cts → model-roles.d.cts} +10 -10
- package/dist/{model-slots.d.mts → model-roles.d.mts} +10 -10
- package/dist/{model-slots.d.ts → model-roles.d.ts} +10 -10
- package/dist/model-roles.js +14 -0
- package/dist/model-roles.js.map +1 -0
- package/dist/o11y/adapter-usage-projection.cjs +9 -8
- package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
- package/dist/o11y/adapter-usage-projection.d.cts +23 -15
- package/dist/o11y/adapter-usage-projection.d.mts +23 -15
- package/dist/o11y/adapter-usage-projection.d.ts +23 -15
- package/dist/o11y/cache-read.cjs +14 -14
- package/dist/o11y/cache-read.cjs.map +1 -1
- package/dist/o11y/cache-read.d.cts +5 -5
- package/dist/o11y/cache-read.d.mts +5 -5
- package/dist/o11y/cache-read.d.ts +5 -5
- package/dist/o11y/derive.cjs.map +1 -1
- package/dist/o11y/derive.d.cts +2 -2
- package/dist/o11y/derive.d.mts +2 -2
- package/dist/o11y/derive.d.ts +2 -2
- package/dist/o11y/eval-usage.cjs +9 -9
- package/dist/o11y/eval-usage.cjs.map +1 -1
- package/dist/o11y/eval-usage.d.cts +7 -7
- package/dist/o11y/eval-usage.d.mts +7 -7
- package/dist/o11y/eval-usage.d.ts +7 -7
- package/dist/o11y/parsers/bub.cjs +57 -81
- package/dist/o11y/parsers/bub.cjs.map +1 -1
- package/dist/o11y/parsers/index.cjs.map +1 -1
- package/dist/o11y/parsers/index.d.cts +2 -0
- package/dist/o11y/parsers/index.d.mts +2 -0
- package/dist/o11y/parsers/index.d.ts +2 -0
- package/dist/o11y/parsers/opencode.cjs +129 -217
- package/dist/o11y/parsers/opencode.cjs.map +1 -1
- package/dist/o11y/parsers/opencode.d.cts +2 -5
- package/dist/o11y/parsers/opencode.d.mts +2 -5
- package/dist/o11y/parsers/opencode.d.ts +2 -5
- package/dist/o11y/types.cjs.map +1 -1
- package/dist/o11y/types.d.cts +1 -1
- package/dist/o11y/types.d.mts +1 -1
- package/dist/o11y/types.d.ts +1 -1
- package/dist/plugin/contracts.cjs +170 -120
- package/dist/plugin/contracts.cjs.map +1 -1
- package/dist/plugin/contracts.d.cts +102 -90
- package/dist/plugin/contracts.d.mts +102 -90
- package/dist/plugin/contracts.d.ts +102 -90
- package/dist/plugin/contracts.js +16 -12
- package/dist/plugin/index.cjs.map +1 -1
- package/dist/plugin/index.d.cts +1 -1
- package/dist/plugin/index.d.mts +1 -1
- package/dist/plugin/index.d.ts +1 -1
- package/dist/plugin/link.cjs +69 -64
- package/dist/plugin/link.cjs.map +1 -1
- package/dist/plugin/link.d.cts +5 -3
- package/dist/plugin/link.d.mts +5 -3
- package/dist/plugin/link.d.ts +5 -3
- package/dist/plugin/link.js +12 -8
- package/dist/record/codec/seal-manifest.d.cts +3 -3
- package/dist/record/codec/seal-manifest.d.mts +3 -3
- package/dist/record/codec/seal-manifest.d.ts +3 -3
- package/dist/record/family/attempt-note/definition.cjs +12 -0
- package/dist/record/family/attempt-note/definition.cjs.map +1 -0
- package/dist/record/family/attempt-note/definition.d.cts +6 -0
- package/dist/record/family/attempt-note/definition.d.mts +6 -0
- package/dist/record/family/attempt-note/definition.d.ts +6 -0
- package/dist/record/family/attempt-note/definition.js +6 -0
- package/dist/record/family/attempt-note/definition.js.map +1 -0
- package/dist/record/family/attempt-note/persistence.cjs +10 -0
- package/dist/record/family/attempt-note/persistence.cjs.map +1 -0
- package/dist/record/family/attempt-note/persistence.d.cts +6 -0
- package/dist/record/family/attempt-note/persistence.d.mts +6 -0
- package/dist/record/family/attempt-note/persistence.d.ts +6 -0
- package/dist/record/family/attempt-note/persistence.js +6 -0
- package/dist/record/family/attempt-note/persistence.js.map +1 -0
- package/dist/record/family/attempt-note/schema.cjs +20 -0
- package/dist/record/family/attempt-note/schema.cjs.map +1 -0
- package/dist/record/family/attempt-note/schema.d.cts +21 -0
- package/dist/record/family/attempt-note/schema.d.mts +21 -0
- package/dist/record/family/attempt-note/schema.d.ts +21 -0
- package/dist/record/family/attempt-note/schema.js +10 -0
- package/dist/record/family/attempt-note/schema.js.map +1 -0
- package/dist/record/family/catalog.cjs +32 -29
- package/dist/record/family/catalog.cjs.map +1 -1
- package/dist/record/family/catalog.d.cts +7 -2
- package/dist/record/family/catalog.d.mts +7 -2
- package/dist/record/family/catalog.d.ts +7 -2
- package/dist/record/family/current.cjs +48 -45
- package/dist/record/family/current.cjs.map +1 -1
- package/dist/record/family/current.d.cts +15 -0
- package/dist/record/family/current.d.mts +15 -0
- package/dist/record/family/current.d.ts +15 -0
- package/dist/record/model/index.js +66 -64
- package/dist/record/model/run-context.cjs +9 -3
- package/dist/record/model/run-context.cjs.map +1 -1
- package/dist/record/model/run-context.d.cts +9 -2
- package/dist/record/model/run-context.d.mts +9 -2
- package/dist/record/model/run-context.d.ts +9 -2
- package/dist/record/model/run-context.js +8 -6
- package/dist/record/model/seal-manifest.d.cts +1 -1
- package/dist/record/model/seal-manifest.d.mts +1 -1
- package/dist/record/model/seal-manifest.d.ts +1 -1
- package/dist/run/cli/contribution.cjs +6 -32
- package/dist/run/cli/contribution.cjs.map +1 -1
- package/dist/run/host/runtime.cjs +1 -1
- package/dist/run/host/runtime.cjs.map +1 -1
- package/dist/run/storage/sqlite.cjs +7 -7
- package/dist/run/storage/sqlite.cjs.map +1 -1
- package/dist/runner/adapter-usage.cjs +5 -3
- package/dist/runner/adapter-usage.cjs.map +1 -1
- package/dist/runner/adapter-usage.d.cts +2 -2
- package/dist/runner/adapter-usage.d.mts +2 -2
- package/dist/runner/adapter-usage.d.ts +2 -2
- package/dist/runner/adoption.cjs +9 -12
- package/dist/runner/adoption.cjs.map +1 -1
- package/dist/runner/attempt-notes.cjs +8 -0
- package/dist/runner/attempt-notes.cjs.map +1 -0
- package/dist/runner/attempt-notes.d.cts +4 -0
- package/dist/runner/attempt-notes.d.mts +4 -0
- package/dist/runner/attempt-notes.d.ts +4 -0
- package/dist/runner/attempt-notes.js +8 -0
- package/dist/runner/attempt-notes.js.map +1 -0
- package/dist/runner/attempt.cjs +61 -73
- package/dist/runner/attempt.cjs.map +1 -1
- package/dist/runner/attempt.d.cts +3 -3
- package/dist/runner/attempt.d.mts +3 -3
- package/dist/runner/attempt.d.ts +3 -3
- package/dist/runner/command-plan.cjs +21 -26
- package/dist/runner/command-plan.cjs.map +1 -1
- package/dist/runner/command-plan.d.cts +4 -4
- package/dist/runner/command-plan.d.mts +4 -4
- package/dist/runner/command-plan.d.ts +4 -4
- package/dist/runner/command-plan.js +4 -4
- package/dist/runner/config-identity.cjs.map +1 -1
- package/dist/runner/config-identity.d.cts +2 -2
- package/dist/runner/config-identity.d.mts +2 -2
- package/dist/runner/config-identity.d.ts +2 -2
- package/dist/runner/discover.cjs +6 -6
- package/dist/runner/discover.cjs.map +1 -1
- package/dist/runner/eval-selection.cjs +2 -2
- package/dist/runner/eval-selection.cjs.map +1 -1
- package/dist/runner/eval-selection.d.cts +2 -2
- package/dist/runner/eval-selection.d.mts +2 -2
- package/dist/runner/eval-selection.d.ts +2 -2
- package/dist/runner/feedback/human.cjs +1 -1
- package/dist/runner/feedback/human.cjs.map +1 -1
- package/dist/runner/feedback/json.cjs +4 -2
- package/dist/runner/feedback/json.cjs.map +1 -1
- package/dist/runner/feedback/json.d.cts +1 -1
- package/dist/runner/feedback/json.d.mts +1 -1
- package/dist/runner/feedback/json.d.ts +1 -1
- package/dist/runner/feedback/sink.cjs +1 -1
- package/dist/runner/feedback/sink.cjs.map +1 -1
- package/dist/runner/feedback/sink.d.cts +1 -1
- package/dist/runner/feedback/sink.d.mts +1 -1
- package/dist/runner/feedback/sink.d.ts +1 -1
- package/dist/runner/fingerprint.cjs +1 -1
- package/dist/runner/fingerprint.cjs.map +1 -1
- package/dist/runner/project-target.cjs.map +1 -1
- package/dist/runner/project-target.d.cts +2 -2
- package/dist/runner/project-target.d.mts +2 -2
- package/dist/runner/project-target.d.ts +2 -2
- package/dist/runner/record/attachments.cjs +2 -2
- package/dist/runner/record/attachments.cjs.map +1 -1
- package/dist/runner/record/planning.cjs +8 -2
- package/dist/runner/record/planning.cjs.map +1 -1
- package/dist/runner/record.cjs +2 -0
- package/dist/runner/record.cjs.map +1 -1
- package/dist/runner/report.cjs +3 -3
- package/dist/runner/report.cjs.map +1 -1
- package/dist/runner/report.d.cts +1 -1
- package/dist/runner/report.d.mts +1 -1
- package/dist/runner/report.d.ts +1 -1
- package/dist/runner/reuse-plan.cjs +2 -2
- package/dist/runner/reuse-plan.cjs.map +1 -1
- package/dist/runner/run.cjs +10 -45
- package/dist/runner/run.cjs.map +1 -1
- package/dist/runner/sandbox-pool.cjs +1 -2
- package/dist/runner/sandbox-pool.cjs.map +1 -1
- package/dist/runner/setup-prefix-preparation.cjs +1 -1
- package/dist/runner/setup-prefix-preparation.cjs.map +1 -1
- package/dist/runner/teardown-registry.cjs +2 -2
- package/dist/runner/teardown-registry.cjs.map +1 -1
- package/dist/runner/teardown-registry.d.cts +1 -1
- package/dist/runner/teardown-registry.d.mts +1 -1
- package/dist/runner/teardown-registry.d.ts +1 -1
- package/dist/runner/types.cjs +4 -4
- package/dist/runner/types.cjs.map +1 -1
- package/dist/runner/types.d.cts +64 -93
- package/dist/runner/types.d.mts +64 -93
- package/dist/runner/types.d.ts +64 -93
- package/dist/runner/types.js +2 -2
- package/dist/sandbox/action.cjs +1 -1
- package/dist/sandbox/action.cjs.map +1 -1
- package/dist/sandbox/cli/contribution.cjs +17 -14
- package/dist/sandbox/cli/contribution.cjs.map +1 -1
- package/dist/sandbox/cli/contribution.d.cts +1 -1
- package/dist/sandbox/cli/contribution.d.mts +1 -1
- package/dist/sandbox/cli/contribution.d.ts +1 -1
- package/dist/sandbox/commands.cjs +1 -1
- package/dist/sandbox/commands.cjs.map +1 -1
- package/dist/sandbox/commands.d.cts +1 -1
- package/dist/sandbox/commands.d.mts +1 -1
- package/dist/sandbox/commands.d.ts +1 -1
- package/dist/sandbox/compose.cjs +2 -2
- package/dist/sandbox/compose.cjs.map +1 -1
- package/dist/sandbox/docker-profile/registry.cjs +5 -9
- package/dist/sandbox/docker-profile/registry.cjs.map +1 -1
- package/dist/sandbox/docker-profile/registry.d.cts +0 -3
- package/dist/sandbox/docker-profile/registry.d.mts +0 -3
- package/dist/sandbox/docker-profile/registry.d.ts +0 -3
- package/dist/sandbox/docker-profile/registry.js +6 -12
- package/dist/sandbox/docker-profile/runtime.cjs +1 -1
- package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
- package/dist/sandbox/docker-profile/schema.cjs +12 -16
- package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
- package/dist/sandbox/docker-profile/schema.d.cts +2 -6
- package/dist/sandbox/docker-profile/schema.d.mts +2 -6
- package/dist/sandbox/docker-profile/schema.d.ts +2 -6
- package/dist/sandbox/docker-profile/schema.js +24 -32
- package/dist/sandbox/incus.cjs +2 -2
- package/dist/sandbox/incus.cjs.map +1 -1
- package/dist/sandbox/index.cjs +4 -35
- package/dist/sandbox/index.cjs.map +1 -1
- package/dist/sandbox/index.d.cts +4 -8
- package/dist/sandbox/index.d.mts +4 -8
- package/dist/sandbox/index.d.ts +4 -8
- package/dist/sandbox/index.js +116 -172
- package/dist/sandbox/index.mjs +116 -172
- package/dist/sandbox/layer.cjs +3 -3
- package/dist/sandbox/layer.cjs.map +1 -1
- package/dist/sandbox/link.cjs +5 -0
- package/dist/sandbox/link.cjs.map +1 -1
- package/dist/sandbox/link.d.cts +3 -0
- package/dist/sandbox/link.d.mts +3 -0
- package/dist/sandbox/link.d.ts +3 -0
- package/dist/sandbox/runtime.cjs +9 -4
- package/dist/sandbox/runtime.cjs.map +1 -1
- package/dist/shared/failure-class.cjs +5 -5
- package/dist/shared/failure-class.cjs.map +1 -1
- package/dist/shared/failure-class.d.cts +4 -10
- package/dist/shared/failure-class.d.mts +4 -10
- package/dist/shared/failure-class.d.ts +4 -10
- package/dist/shared/types.cjs.map +1 -1
- package/dist/shared/types.d.cts +1 -1
- package/dist/shared/types.d.mts +1 -1
- package/dist/shared/types.d.ts +1 -1
- package/dist/show/contribution.cjs +17 -2
- package/dist/show/contribution.cjs.map +1 -1
- package/dist/show/contribution.d.cts +14 -0
- package/dist/show/contribution.d.mts +14 -0
- package/dist/show/contribution.d.ts +14 -0
- package/dist/show/model.cjs +8 -5
- package/dist/show/model.cjs.map +1 -1
- package/dist/show/model.d.cts +11 -8
- package/dist/show/model.d.mts +11 -8
- package/dist/show/model.d.ts +11 -8
- package/dist/show/render.cjs +34 -22
- package/dist/show/render.cjs.map +1 -1
- package/dist/sources/projector.cjs +1 -1
- package/dist/sources/projector.cjs.map +1 -1
- package/dist/types.cjs +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +2 -2
- package/dist/view/app-dist/.vite/manifest.json +2 -2
- package/dist/view/app-dist/assets/{index-B3ijZRph.js → index-CxrOUvHC.js} +17 -17
- package/dist/view/app-dist/assets/{quality-cost-scatter-B--DfJ9s.js → quality-cost-scatter-B6Aiss7x.js} +1 -1
- package/dist/view/app-dist/index.html +1 -1
- package/dist/view/cli/contribution.cjs +1 -1
- package/dist/view/cli/contribution.cjs.map +1 -1
- package/dist/view/function-runtime.mjs +318 -121
- package/dist/view/http-protocol.d.cts +1 -1
- package/dist/view/http-protocol.d.mts +1 -1
- package/dist/view/http-protocol.d.ts +1 -1
- package/dist/view/inspection-host.cjs +2 -2
- package/dist/view/inspection-host.cjs.map +1 -1
- package/dist/view/inspection-host.d.cts +349 -331
- package/dist/view/inspection-host.d.mts +349 -331
- package/dist/view/inspection-host.d.ts +349 -331
- package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +6 -6
- package/docs-site/zh/examples/integrations/claude-sdk.mdx +5 -5
- package/docs-site/zh/examples/integrations/codex-sdk.mdx +4 -4
- package/docs-site/zh/examples/integrations/langgraph.mdx +4 -4
- package/docs-site/zh/examples/integrations/pi-sdk.mdx +5 -5
- package/docs-site/zh/explanation/adapter.mdx +6 -6
- package/docs-site/zh/explanation/assert.mdx +7 -7
- package/docs-site/zh/explanation/drive.mdx +4 -4
- package/docs-site/zh/explanation/hitl.mdx +2 -2
- package/docs-site/zh/explanation/judge.mdx +2 -2
- package/docs-site/zh/introduction.mdx +2 -2
- package/docs-site/zh/reference/builtin-agents.mdx +46 -49
- package/docs-site/zh/reference/cli.mdx +16 -14
- package/docs-site/zh/reference/define-agent.mdx +19 -19
- package/docs-site/zh/reference/define-config.mdx +7 -15
- package/docs-site/zh/reference/define-eval.mdx +20 -14
- package/docs-site/zh/reference/define-experiment.mdx +18 -39
- package/docs-site/zh/reference/events.mdx +1 -1
- package/docs-site/zh/reference/expect.mdx +21 -0
- package/docs-site/zh/reference/official-adapters.mdx +12 -5
- package/docs-site/zh/troubleshooting/debugging.mdx +2 -2
- package/docs-site/zh/troubleshooting/recover-after-kill.mdx +1 -1
- package/docs-site/zh/tutorials/agent-onboarding.mdx +2 -2
- package/docs-site/zh/tutorials/authoring.mdx +2 -2
- package/docs-site/zh/tutorials/compare-runs.mdx +1 -1
- package/docs-site/zh/tutorials/concurrency.mdx +8 -8
- package/docs-site/zh/tutorials/configuration.mdx +5 -5
- package/docs-site/zh/tutorials/control-run-cost.mdx +19 -19
- package/docs-site/zh/tutorials/eval-groups.mdx +1 -1
- package/docs-site/zh/tutorials/evaluation-kinds.mdx +5 -5
- package/docs-site/zh/tutorials/experiment-services.mdx +32 -32
- package/docs-site/zh/tutorials/handle-execution-failures.mdx +2 -28
- package/docs-site/zh/tutorials/plugins.mdx +49 -143
- package/docs-site/zh/tutorials/sandbox-agent.mdx +1 -1
- package/docs-site/zh/tutorials/sandbox-reuse.mdx +7 -7
- package/docs-site/zh/tutorials/upgrade-0-18.mdx +1 -1
- package/docs-site/zh/tutorials/upgrade-0-19.mdx +121 -0
- package/docs-site/zh/tutorials/upgrade-0-20.mdx +12 -0
- package/docs-site/zh/tutorials/verify-judge.mdx +2 -2
- package/docs-site/zh/tutorials/viewing-results.mdx +2 -2
- package/docs-site/zh/tutorials/write-experiment.mdx +1 -1
- package/docs-site/zh/tutorials/write-send.mdx +13 -13
- package/package.json +1 -1
- package/dist/agents/effect-runtime.cjs.map +0 -1
- package/dist/agents/effect-runtime.d.cts +0 -29
- package/dist/agents/effect-runtime.d.mts +0 -29
- package/dist/agents/effect-runtime.d.ts +0 -29
- package/dist/agents/effect-runtime.js +0 -16
- package/dist/agents/effect-runtime.js.map +0 -1
- package/dist/agents/session-slot.cjs.map +0 -1
- package/dist/agents/session-slot.d.cts +0 -12
- package/dist/agents/session-slot.d.mts +0 -12
- package/dist/agents/session-slot.d.ts +0 -12
- package/dist/agents/session-slot.js +0 -6
- package/dist/agents/session-slot.js.map +0 -1
- package/dist/model-slots.js +0 -14
- package/dist/model-slots.js.map +0 -1
|
@@ -71,14 +71,14 @@ langgraph/
|
|
|
71
71
|
<div className="gd-file">
|
|
72
72
|
<div className="gd-head"><span className="gd-name">{"niceeval.config.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+14"}</span></span></div>
|
|
73
73
|
<div className="gd-body">
|
|
74
|
-
<table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineConfig } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { OpenAIProvider } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/judge\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 注:这个 app 的 .env 把标准的 OPENAI_API_KEY / OPENAI_BASE_URL 挪用给了 DeepSeek"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// (agent.py 里 ChatOpenAI 直接读这两个 env 名)。niceeval 的 Judge assertion"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 不碰这两个名字:端点与凭据来源由 OpenAIProvider 显式声明,这里改读"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// NICEEVAL_JUDGE_KEY;judge 走独立凭证,不和应用的模型配置互相干扰。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineConfig"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" name: { "}</span><span className="gdt2">{"\"zh-CN\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"LangGraph 示例\""}</span><span className="gdt0">{", en: "}</span><span className="gdt2">{"\"LangGraph example\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"
|
|
74
|
+
<table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineConfig } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { OpenAIProvider } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/judge\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 注:这个 app 的 .env 把标准的 OPENAI_API_KEY / OPENAI_BASE_URL 挪用给了 DeepSeek"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// (agent.py 里 ChatOpenAI 直接读这两个 env 名)。niceeval 的 Judge assertion"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 不碰这两个名字:端点与凭据来源由 OpenAIProvider 显式声明,这里改读"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// NICEEVAL_JUDGE_KEY;judge 走独立凭证,不和应用的模型配置互相干扰。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineConfig"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" name: { "}</span><span className="gdt2">{"\"zh-CN\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"LangGraph 示例\""}</span><span className="gdt0">{", en: "}</span><span className="gdt2">{"\"LangGraph example\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" judgeProvider: "}</span><span className="gdt5">{"OpenAIProvider"}</span><span className="gdt0">{"({ model: "}</span><span className="gdt2">{"\"gpt-5.4\""}</span><span className="gdt0">{", apiKeyEnv: "}</span><span className="gdt2">{"\"NICEEVAL_JUDGE_KEY\""}</span><span className="gdt0">{" }),"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" timeoutMs: "}</span><span className="gdt1">{"120_000"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 被测应用是用户自己起的长驻服务,别开太高并发。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" maxConcurrency: "}</span><span className="gdt1">{"2"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"14"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
|
|
75
75
|
</div>
|
|
76
76
|
</div>
|
|
77
77
|
|
|
78
78
|
<div className="gd-file">
|
|
79
79
|
<div className="gd-head"><span className="gd-name">{"agents/langgraph.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+185"}</span></span></div>
|
|
80
80
|
<div className="gd-body">
|
|
81
|
-
<table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { Effect } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"effect\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// langgraph 的 adapter:无侵入对接 ../src/backend/server.py —— 自定义 JSON 帧 over SSE"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// (server.py 不透传 LangGraph 原生 stream 事件,自己翻译成一套小协议,见其头注释)。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"//"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 断言依据全部来自这条流,零 OTel 依赖:"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// · `tool-input` → operation.started、`tool-output` → operation.finished(completed,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 带 isError 时 failed)、`tool-output-denied` → operation.finished(rejected)——"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 协议帧里本来就有全量工具过程;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// · `text-delta` 累积成完整回复,轮次结束补一条 message 事件;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// · HITL:`tool-approval-request` → input.requested + waiting,停轮现场(还开着的流 +"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 挂起的 toolCallId)用 heldSlot 存住,回答轮 take(heldSlot) 取回接着读。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"//"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 这是 Tier 1(只接 send):要 `niceeval view` 的调用瀑布图时升 Tier 2,见"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"14"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// ../../tier2/langgraph/——config 加一行 telemetry、本文件加一段 span 收尾宽限,其它不变。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"15"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { createSessionSlot, defineAgent, sseJsonFrames } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/adapter\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"16"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"type"}</span><span className="gdt0">{" { AgentContext, EvidenceCoverage, SseFrameCursor } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/adapter\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"17"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"type"}</span><span className="gdt0">{" { JsonValue, StreamEvent, Turn, TurnInput } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"18"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"19"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 被测应用由你自己按它的方式启动(python server.py / 部署在哪都行),eval 不代管进程、"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"20"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 不另开端口。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"21"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"BASE_URL"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" process.env."}</span><span className="gdt1">{"LANGGRAPH_URL"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"??"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"http://127.0.0.1:35000\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"22"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"23"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"function"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"appFetch"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"path"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{", "}</span><span className="gdt7">{"body"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"unknown"}</span><span className="gdt0">{", "}</span><span className="gdt7">{"signal"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"AbortSignal"}</span><span className="gdt0">{")"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Promise"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"Response"}</span><span className="gdt0">{"> {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"24"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"try"}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"25"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"fetch"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"`${"}</span><span className="gdt1">{"BASE_URL"}</span><span className="gdt2">{"}${"}</span><span className="gdt0">{"path"}</span><span className="gdt2">{"}`"}</span><span className="gdt0">{", {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"26"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" method: "}</span><span className="gdt2">{"\"POST\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"27"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" headers: { "}</span><span className="gdt2">{"\"content-type\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"application/json\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"28"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" body: "}</span><span className="gdt1">{"JSON"}</span><span className="gdt0">{"."}</span><span className="gdt5">{"stringify"}</span><span className="gdt0">{"(body),"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"29"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" signal,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"30"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"31"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" } "}</span><span className="gdt4">{"catch"}</span><span className="gdt0">{" (err) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"32"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" (signal.aborted) "}</span><span className="gdt4">{"throw"}</span><span className="gdt0">{" err;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"33"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"throw"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"new"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Error"}</span><span className="gdt0">{"("}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"34"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt2">{"`连不上 ${"}</span><span className="gdt1">{"BASE_URL"}</span><span className="gdt2">{"}${"}</span><span className="gdt0">{"path"}</span><span className="gdt2">{"}。被测应用在跑吗?先起它(见 README「跑起来」),或设 LANGGRAPH_URL 指向已部署实例。`"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"35"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" );"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"36"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"37"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"}"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"38"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"39"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"type"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"LanggraphFrame"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"40"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"session\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"sessionId"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"41"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"text-delta\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"delta"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"42"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-input\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"toolCallId"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"name"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"input"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"unknown"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"43"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-output\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"toolCallId"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"output"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"unknown"}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"isError"}</span><span className="gdt4">{"?:"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"boolean"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"44"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-approval-request\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"toolCallId"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"45"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-output-denied\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"toolCallId"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"46"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"error\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"message"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"47"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"finish\""}</span><span className="gdt0">{" };"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"48"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"49"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"type"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"SseCursor"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt5">{"SseFrameCursor"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"LanggraphFrame"}</span><span className="gdt0">{">;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"50"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"51"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// HITL 停轮现场:还开着的流 + 挂起的审批 toolCallId。approve/deny 的续读发生在下一次"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"52"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// send()(一个全新的 drainStream 调用),局部变量活不过这次函数返回——存进 heldSlot,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"53"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 回答轮 take(heldSlot) 取回(取到即清除,一次消费)。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"54"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"interface"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"PendingApproval"}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"55"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"readonly"}</span><span className="gdt0">{" "}</span><span className="gdt7">{"cursor"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"SseCursor"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"56"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"readonly"}</span><span className="gdt0">{" "}</span><span className="gdt7">{"toolCallId"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"57"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"}"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"58"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"heldSlot"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt5">{"createSessionSlot"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"PendingApproval"}</span><span className="gdt0">{">("}</span><span className="gdt2">{"\"langgraph/held-stream\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"59"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"60"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"evidenceCoverage"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"61"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" events: { status: "}</span><span className="gdt2">{"\"complete\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"62"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" actions: { status: "}</span><span className="gdt2">{"\"complete\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"63"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" messages: { status: "}</span><span className="gdt2">{"\"complete\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"64"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" usage: { status: "}</span><span className="gdt2">{"\"unavailable\""}</span><span className="gdt0">{", reason: "}</span><span className="gdt2">{"\"LangGraph 自定义 SSE 协议不包含 token usage\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"65"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" status: { status: "}</span><span className="gdt2">{"\"complete\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"66"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" data: { status: "}</span><span className="gdt2">{"\"unavailable\""}</span><span className="gdt0">{", reason: "}</span><span className="gdt2">{"\"adapter 不产生 Turn.data\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"67"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"} "}</span><span className="gdt4">{"satisfies"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"EvidenceCoverage"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"68"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"69"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"function"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"drainStream"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"cursor"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"SseCursor"}</span><span className="gdt0">{", "}</span><span className="gdt7">{"ctx"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"AgentContext"}</span><span className="gdt0">{")"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Promise"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"Turn"}</span><span className="gdt0">{"> {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"70"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"events"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"StreamEvent"}</span><span className="gdt0">{"[] "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" [];"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"71"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"let"}</span><span className="gdt0">{" status"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"completed\""}</span><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"failed\""}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"completed\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"72"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"let"}</span><span className="gdt0">{" messageText "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"73"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 本次 drain 里见过的 tool-input,按 operationId 记名字——tool-approval-request 帧不带工具名,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"74"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// input.requested 的 action 字段从这里查。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"75"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"toolNames"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"new"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Map"}</span><span className="gdt0">{"<"}</span><span className="gdt1">{"string"}</span><span className="gdt0">{", "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{">();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"76"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"77"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"finalize"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"async"}</span><span className="gdt0">{" ()"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Promise"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"Turn"}</span><span className="gdt0">{"> "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"78"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" (messageText) events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({ type: "}</span><span className="gdt2">{"\"message\""}</span><span className="gdt0">{", role: "}</span><span className="gdt2">{"\"assistant\""}</span><span className="gdt0">{", text: messageText });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"79"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" { status, events };"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"80"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" };"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"81"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"82"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"for"}</span><span className="gdt0">{" (;;) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"83"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"frame"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" cursor."}</span><span className="gdt5">{"next"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"84"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" (frame "}</span><span className="gdt4">{"==="}</span><span className="gdt0">{" "}</span><span className="gdt1">{"null"}</span><span className="gdt0">{") "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"85"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"86"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"switch"}</span><span className="gdt0">{" (frame.type) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"87"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"session\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"88"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 会话续接走「服务端记历史」范式:session 帧回传的 id 用 ctx.session.capture 写回。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"89"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" ctx.session."}</span><span className="gdt5">{"capture"}</span><span className="gdt0">{"(frame.sessionId);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"90"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"91"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"92"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"text-delta\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"93"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" messageText "}</span><span className="gdt4">{"+="}</span><span className="gdt0">{" frame.delta;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"94"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"95"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"96"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-input\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"97"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" toolNames."}</span><span className="gdt5">{"set"}</span><span className="gdt0">{"(frame.toolCallId, frame.name);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"98"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"99"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" type: "}</span><span className="gdt2">{"\"operation.started\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"100"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" operationId: frame.toolCallId,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"101"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" operation: { kind: "}</span><span className="gdt2">{"\"tool\""}</span><span className="gdt0">{", name: frame.name, input: frame.input "}</span><span className="gdt4">{"as"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"JsonValue"}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"102"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"103"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"104"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"105"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-output\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"106"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"107"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" type: "}</span><span className="gdt2">{"\"operation.finished\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"108"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" operationId: frame.toolCallId,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"109"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" kind: "}</span><span className="gdt2">{"\"tool\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"110"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" output: frame.output "}</span><span className="gdt4">{"as"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"JsonValue"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"111"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" status: frame.isError "}</span><span className="gdt4">{"==="}</span><span className="gdt0">{" "}</span><span className="gdt1">{"true"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"?"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"failed\""}</span><span className="gdt0">{" "}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"completed\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"112"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"113"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"114"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"115"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-approval-request\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"116"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 停轮:流不关,现场 hold 住;回答轮 take 回来接着读同一条流,不重新发起请求。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"117"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 中断前模型可能已经吐了一段前言(比如\"好的,我来算一下\"),一并收进这一轮。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"118"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" ctx.session."}</span><span className="gdt5">{"set"}</span><span className="gdt0">{"(heldSlot, { cursor, toolCallId: frame.toolCallId });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"119"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" (messageText) events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({ type: "}</span><span className="gdt2">{"\"message\""}</span><span className="gdt0">{", role: "}</span><span className="gdt2">{"\"assistant\""}</span><span className="gdt0">{", text: messageText });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"120"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"121"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" type: "}</span><span className="gdt2">{"\"input.requested\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"122"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" request: {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"123"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" id: frame.toolCallId,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"124"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" action: toolNames."}</span><span className="gdt5">{"get"}</span><span className="gdt0">{"(frame.toolCallId) "}</span><span className="gdt4">{"??"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"125"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" options: [{ id: "}</span><span className="gdt2">{"\"approve\""}</span><span className="gdt0">{" }, { id: "}</span><span className="gdt2">{"\"deny\""}</span><span className="gdt0">{" }],"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"126"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"127"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"128"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" { status: "}</span><span className="gdt2">{"\"waiting\""}</span><span className="gdt0">{", events };"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"129"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"130"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-output-denied\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"131"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 被拒绝的调用不执行:operation.started 在 tool-input 帧(上一轮)已落,这里只补"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"132"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// rejected 的 operation.finished——同一个 operationId,跨轮配对。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"133"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({ type: "}</span><span className="gdt2">{"\"operation.finished\""}</span><span className="gdt0">{", operationId: frame.toolCallId, kind: "}</span><span className="gdt2">{"\"tool\""}</span><span className="gdt0">{", status: "}</span><span className="gdt2">{"\"rejected\""}</span><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"134"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"135"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"136"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"error\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"137"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" status "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"failed\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"138"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({ type: "}</span><span className="gdt2">{"\"error\""}</span><span className="gdt0">{", message: frame.message });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"139"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"140"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"141"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"finish\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"142"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"finalize"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"143"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"144"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{":"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"145"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"146"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"147"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"148"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"149"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"finalize"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"150"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"}"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"151"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"152"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"function"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"input"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"TurnInput"}</span><span className="gdt0">{", "}</span><span className="gdt7">{"ctx"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"AgentContext"}</span><span className="gdt0">{")"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Promise"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"Turn"}</span><span className="gdt0">{"> {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"153"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 回答轮:取回停轮现场,把裁决交回应用,接着读同一条流。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"154"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"pending"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" ctx.session."}</span><span className="gdt5">{"take"}</span><span className="gdt0">{"(heldSlot);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"155"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" (pending) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"156"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 按 requestId(挂起的 toolCallId)从 input.responses 里对位取裁决,不从 text 猜;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"157"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 这里每次只挂一条审批,取第一条即可——多请求并停时按 requestId 对位。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"158"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"approved"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" input.responses?.["}</span><span className="gdt1">{"0"}</span><span className="gdt0">{"]?.optionId "}</span><span className="gdt4">{"==="}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"approve\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"159"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"approveRes"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"appFetch"}</span><span className="gdt0">{"("}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"160"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt2">{"\"/api/chat/approve\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"161"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" { toolCallId: pending.toolCallId, approved },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"162"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" ctx.signal,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"163"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" );"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"164"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" ("}</span><span className="gdt4">{"!"}</span><span className="gdt0">{"approveRes.ok) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"165"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"throw"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"new"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Error"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"`POST /api/chat/approve 失败: ${"}</span><span className="gdt0">{"approveRes"}</span><span className="gdt2">{"."}</span><span className="gdt0">{"status"}</span><span className="gdt2">{"} ${"}</span><span className="gdt4">{"await"}</span><span className="gdt2">{" "}</span><span className="gdt0">{"approveRes"}</span><span className="gdt2">{"."}</span><span className="gdt5">{"text"}</span><span className="gdt2">{"()"}</span><span className="gdt2">{"}`"}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"166"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"167"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"drainStream"}</span><span className="gdt0">{"(pending.cursor, ctx);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"168"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"169"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"170"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"res"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"appFetch"}</span><span className="gdt0">{"("}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"171"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt2">{"\"/api/chat\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"172"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" { message: input.text, sessionId: ctx.session.id },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"173"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" ctx.signal,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"174"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" );"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"175"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" ("}</span><span className="gdt4">{"!"}</span><span className="gdt0">{"res.ok "}</span><span className="gdt4">{"||"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"!"}</span><span className="gdt0">{"res.body) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"176"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"throw"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"new"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Error"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"`POST /api/chat 失败: ${"}</span><span className="gdt0">{"res"}</span><span className="gdt2">{"."}</span><span className="gdt0">{"status"}</span><span className="gdt2">{"} ${"}</span><span className="gdt4">{"await"}</span><span className="gdt2">{" "}</span><span className="gdt0">{"res"}</span><span className="gdt2">{"."}</span><span className="gdt5">{"text"}</span><span className="gdt2">{"()."}</span><span className="gdt5">{"catch"}</span><span className="gdt2">{"(() "}</span><span className="gdt4">{"=>"}</span><span className="gdt2">{" "}</span><span className="gdt2">{"\"\""}</span><span className="gdt2">{")"}</span><span className="gdt2">{"}`"}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"177"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"178"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"drainStream"}</span><span className="gdt0">{"("}</span><span className="gdt5">{"sseJsonFrames"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"LanggraphFrame"}</span><span className="gdt0">{">(res.body), ctx);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"179"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"}"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"180"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"181"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineAgent"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"182"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" name: "}</span><span className="gdt2">{"\"langgraph\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"183"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" evidenceCoverage,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"184"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt5">{"send"}</span><span className="gdt0">{": ("}</span><span className="gdt7">{"input"}</span><span className="gdt0">{", "}</span><span className="gdt7">{"ctx"}</span><span className="gdt0">{") "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" Effect."}</span><span className="gdt5">{"tryPromise"}</span><span className="gdt0">{"({ "}</span><span className="gdt5">{"try"}</span><span className="gdt0">{": () "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"(input, ctx), "}</span><span className="gdt5">{"catch"}</span><span className="gdt0">{": ("}</span><span className="gdt7">{"cause"}</span><span className="gdt0">{") "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" cause }),"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"185"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
|
|
81
|
+
<table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { Effect } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"effect\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// langgraph 的 adapter:无侵入对接 ../src/backend/server.py —— 自定义 JSON 帧 over SSE"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// (server.py 不透传 LangGraph 原生 stream 事件,自己翻译成一套小协议,见其头注释)。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"//"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 断言依据全部来自这条流,零 OTel 依赖:"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// · `tool-input` → operation.started、`tool-output` → operation.finished(completed,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 带 isError 时 failed)、`tool-output-denied` → operation.finished(rejected)——"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 协议帧里本来就有全量工具过程;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// · `text-delta` 累积成完整回复,轮次结束补一条 message 事件;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// · HITL:`tool-approval-request` → input.requested + waiting,停轮现场(还开着的流 +"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 挂起的 toolCallId)用 heldKey 存住,回答轮 take(heldKey) 取回接着读。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"//"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 这是 Tier 1(只接 send):要 `niceeval view` 的调用瀑布图时升 Tier 2,见"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"14"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// ../../tier2/langgraph/——config 加一行 telemetry、本文件加一段 span 收尾宽限,其它不变。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"15"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { createSessionKey, defineAgent, sseJsonFrames } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/adapter\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"16"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"type"}</span><span className="gdt0">{" { AgentContext, EvidenceCoverage, SseFrameCursor } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/adapter\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"17"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"type"}</span><span className="gdt0">{" { JsonValue, StreamEvent, Turn, TurnInput } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"18"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"19"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 被测应用由你自己按它的方式启动(python server.py / 部署在哪都行),eval 不代管进程、"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"20"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 不另开端口。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"21"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"BASE_URL"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" process.env."}</span><span className="gdt1">{"LANGGRAPH_URL"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"??"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"http://127.0.0.1:35000\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"22"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"23"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"function"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"appFetch"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"path"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{", "}</span><span className="gdt7">{"body"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"unknown"}</span><span className="gdt0">{", "}</span><span className="gdt7">{"signal"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"AbortSignal"}</span><span className="gdt0">{")"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Promise"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"Response"}</span><span className="gdt0">{"> {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"24"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"try"}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"25"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"fetch"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"`${"}</span><span className="gdt1">{"BASE_URL"}</span><span className="gdt2">{"}${"}</span><span className="gdt0">{"path"}</span><span className="gdt2">{"}`"}</span><span className="gdt0">{", {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"26"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" method: "}</span><span className="gdt2">{"\"POST\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"27"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" headers: { "}</span><span className="gdt2">{"\"content-type\""}</span><span className="gdt0">{": "}</span><span className="gdt2">{"\"application/json\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"28"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" body: "}</span><span className="gdt1">{"JSON"}</span><span className="gdt0">{"."}</span><span className="gdt5">{"stringify"}</span><span className="gdt0">{"(body),"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"29"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" signal,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"30"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"31"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" } "}</span><span className="gdt4">{"catch"}</span><span className="gdt0">{" (err) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"32"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" (signal.aborted) "}</span><span className="gdt4">{"throw"}</span><span className="gdt0">{" err;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"33"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"throw"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"new"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Error"}</span><span className="gdt0">{"("}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"34"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt2">{"`连不上 ${"}</span><span className="gdt1">{"BASE_URL"}</span><span className="gdt2">{"}${"}</span><span className="gdt0">{"path"}</span><span className="gdt2">{"}。被测应用在跑吗?先起它(见 README「跑起来」),或设 LANGGRAPH_URL 指向已部署实例。`"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"35"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" );"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"36"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"37"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"}"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"38"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"39"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"type"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"LanggraphFrame"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"40"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"session\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"sessionId"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"41"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"text-delta\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"delta"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"42"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-input\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"toolCallId"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"name"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"input"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"unknown"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"43"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-output\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"toolCallId"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"output"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"unknown"}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"isError"}</span><span className="gdt4">{"?:"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"boolean"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"44"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-approval-request\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"toolCallId"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"45"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-output-denied\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"toolCallId"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"46"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"error\""}</span><span className="gdt0">{"; "}</span><span className="gdt7">{"message"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"47"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" { "}</span><span className="gdt7">{"type"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"finish\""}</span><span className="gdt0">{" };"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"48"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"49"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"type"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"SseCursor"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt5">{"SseFrameCursor"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"LanggraphFrame"}</span><span className="gdt0">{">;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"50"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"51"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// HITL 停轮现场:还开着的流 + 挂起的审批 toolCallId。approve/deny 的续读发生在下一次"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"52"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// send()(一个全新的 drainStream 调用),局部变量活不过这次函数返回——存进 heldKey,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"53"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 回答轮 take(heldKey) 取回(取到即清除,一次消费)。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"54"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"interface"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"PendingApproval"}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"55"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"readonly"}</span><span className="gdt0">{" "}</span><span className="gdt7">{"cursor"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"SseCursor"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"56"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"readonly"}</span><span className="gdt0">{" "}</span><span className="gdt7">{"toolCallId"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"57"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"}"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"58"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"heldKey"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt5">{"createSessionKey"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"PendingApproval"}</span><span className="gdt0">{">("}</span><span className="gdt2">{"\"langgraph/held-stream\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"59"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"60"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"evidenceCoverage"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"61"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" events: { status: "}</span><span className="gdt2">{"\"complete\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"62"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" actions: { status: "}</span><span className="gdt2">{"\"complete\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"63"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" messages: { status: "}</span><span className="gdt2">{"\"complete\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"64"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" usage: { status: "}</span><span className="gdt2">{"\"unavailable\""}</span><span className="gdt0">{", reason: "}</span><span className="gdt2">{"\"LangGraph 自定义 SSE 协议不包含 token usage\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"65"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" status: { status: "}</span><span className="gdt2">{"\"complete\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"66"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" data: { status: "}</span><span className="gdt2">{"\"unavailable\""}</span><span className="gdt0">{", reason: "}</span><span className="gdt2">{"\"adapter 不产生 Turn.data\""}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"67"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"} "}</span><span className="gdt4">{"satisfies"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"EvidenceCoverage"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"68"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"69"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"function"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"drainStream"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"cursor"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"SseCursor"}</span><span className="gdt0">{", "}</span><span className="gdt7">{"ctx"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"AgentContext"}</span><span className="gdt0">{")"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Promise"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"Turn"}</span><span className="gdt0">{"> {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"70"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"events"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"StreamEvent"}</span><span className="gdt0">{"[] "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" [];"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"71"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"let"}</span><span className="gdt0">{" status"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"completed\""}</span><span className="gdt0">{" "}</span><span className="gdt4">{"|"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"failed\""}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"completed\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"72"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"let"}</span><span className="gdt0">{" messageText "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"73"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 本次 drain 里见过的 tool-input,按 operationId 记名字——tool-approval-request 帧不带工具名,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"74"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// input.requested 的 action 字段从这里查。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"75"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"toolNames"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"new"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Map"}</span><span className="gdt0">{"<"}</span><span className="gdt1">{"string"}</span><span className="gdt0">{", "}</span><span className="gdt1">{"string"}</span><span className="gdt0">{">();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"76"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"77"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"finalize"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"async"}</span><span className="gdt0">{" ()"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Promise"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"Turn"}</span><span className="gdt0">{"> "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"78"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" (messageText) events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({ type: "}</span><span className="gdt2">{"\"message\""}</span><span className="gdt0">{", role: "}</span><span className="gdt2">{"\"assistant\""}</span><span className="gdt0">{", text: messageText });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"79"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" { status, events };"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"80"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" };"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"81"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"82"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"for"}</span><span className="gdt0">{" (;;) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"83"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"frame"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" cursor."}</span><span className="gdt5">{"next"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"84"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" (frame "}</span><span className="gdt4">{"==="}</span><span className="gdt0">{" "}</span><span className="gdt1">{"null"}</span><span className="gdt0">{") "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"85"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"86"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"switch"}</span><span className="gdt0">{" (frame.type) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"87"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"session\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"88"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 会话续接走「服务端记历史」范式:session 帧回传的 id 用 ctx.session.capture 写回。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"89"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" ctx.session."}</span><span className="gdt5">{"capture"}</span><span className="gdt0">{"(frame.sessionId);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"90"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"91"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"92"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"text-delta\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"93"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" messageText "}</span><span className="gdt4">{"+="}</span><span className="gdt0">{" frame.delta;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"94"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"95"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"96"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-input\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"97"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" toolNames."}</span><span className="gdt5">{"set"}</span><span className="gdt0">{"(frame.toolCallId, frame.name);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"98"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"99"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" type: "}</span><span className="gdt2">{"\"operation.started\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"100"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" operationId: frame.toolCallId,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"101"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" operation: { kind: "}</span><span className="gdt2">{"\"tool\""}</span><span className="gdt0">{", name: frame.name, input: frame.input "}</span><span className="gdt4">{"as"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"JsonValue"}</span><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"102"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"103"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"104"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"105"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-output\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"106"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"107"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" type: "}</span><span className="gdt2">{"\"operation.finished\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"108"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" operationId: frame.toolCallId,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"109"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" kind: "}</span><span className="gdt2">{"\"tool\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"110"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" output: frame.output "}</span><span className="gdt4">{"as"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"JsonValue"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"111"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" status: frame.isError "}</span><span className="gdt4">{"==="}</span><span className="gdt0">{" "}</span><span className="gdt1">{"true"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"?"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"failed\""}</span><span className="gdt0">{" "}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"completed\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"112"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"113"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"114"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"115"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-approval-request\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"116"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 停轮:流不关,现场 hold 住;回答轮 take 回来接着读同一条流,不重新发起请求。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"117"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 中断前模型可能已经吐了一段前言(比如\"好的,我来算一下\"),一并收进这一轮。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"118"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" ctx.session."}</span><span className="gdt5">{"set"}</span><span className="gdt0">{"(heldKey, { cursor, toolCallId: frame.toolCallId });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"119"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" (messageText) events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({ type: "}</span><span className="gdt2">{"\"message\""}</span><span className="gdt0">{", role: "}</span><span className="gdt2">{"\"assistant\""}</span><span className="gdt0">{", text: messageText });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"120"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"121"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" type: "}</span><span className="gdt2">{"\"input.requested\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"122"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" request: {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"123"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" id: frame.toolCallId,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"124"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" action: toolNames."}</span><span className="gdt5">{"get"}</span><span className="gdt0">{"(frame.toolCallId) "}</span><span className="gdt4">{"??"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"125"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" options: [{ id: "}</span><span className="gdt2">{"\"approve\""}</span><span className="gdt0">{" }, { id: "}</span><span className="gdt2">{"\"deny\""}</span><span className="gdt0">{" }],"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"126"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"127"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"128"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" { status: "}</span><span className="gdt2">{"\"waiting\""}</span><span className="gdt0">{", events };"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"129"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"130"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"tool-output-denied\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"131"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 被拒绝的调用不执行:operation.started 在 tool-input 帧(上一轮)已落,这里只补"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"132"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// rejected 的 operation.finished——同一个 operationId,跨轮配对。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"133"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({ type: "}</span><span className="gdt2">{"\"operation.finished\""}</span><span className="gdt0">{", operationId: frame.toolCallId, kind: "}</span><span className="gdt2">{"\"tool\""}</span><span className="gdt0">{", status: "}</span><span className="gdt2">{"\"rejected\""}</span><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"134"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"135"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"136"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"error\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"137"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" status "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"failed\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"138"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" events."}</span><span className="gdt5">{"push"}</span><span className="gdt0">{"({ type: "}</span><span className="gdt2">{"\"error\""}</span><span className="gdt0">{", message: frame.message });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"139"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"140"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"141"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"case"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"finish\""}</span><span className="gdt0">{": {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"142"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"finalize"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"143"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"144"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{":"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"145"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"break"}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"146"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"147"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"148"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"149"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"finalize"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"150"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"}"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"151"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"152"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"function"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"input"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"TurnInput"}</span><span className="gdt0">{", "}</span><span className="gdt7">{"ctx"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"AgentContext"}</span><span className="gdt0">{")"}</span><span className="gdt4">{":"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Promise"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"Turn"}</span><span className="gdt0">{"> {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"153"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 回答轮:取回停轮现场,把裁决交回应用,接着读同一条流。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"154"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"pending"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" ctx.session."}</span><span className="gdt5">{"take"}</span><span className="gdt0">{"(heldKey);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"155"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" (pending) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"156"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 按 requestId(挂起的 toolCallId)从 input.responses 里对位取裁决,不从 text 猜;"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"157"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt6">{"// 这里每次只挂一条审批,取第一条即可——多请求并停时按 requestId 对位。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"158"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"approved"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" input.responses?.["}</span><span className="gdt1">{"0"}</span><span className="gdt0">{"]?.optionId "}</span><span className="gdt4">{"==="}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"approve\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"159"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"approveRes"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"appFetch"}</span><span className="gdt0">{"("}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"160"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt2">{"\"/api/chat/approve\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"161"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" { toolCallId: pending.toolCallId, approved },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"162"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" ctx.signal,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"163"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" );"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"164"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" ("}</span><span className="gdt4">{"!"}</span><span className="gdt0">{"approveRes.ok) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"165"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"throw"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"new"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Error"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"`POST /api/chat/approve 失败: ${"}</span><span className="gdt0">{"approveRes"}</span><span className="gdt2">{"."}</span><span className="gdt0">{"status"}</span><span className="gdt2">{"} ${"}</span><span className="gdt4">{"await"}</span><span className="gdt2">{" "}</span><span className="gdt0">{"approveRes"}</span><span className="gdt2">{"."}</span><span className="gdt5">{"text"}</span><span className="gdt2">{"()"}</span><span className="gdt2">{"}`"}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"166"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"167"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"drainStream"}</span><span className="gdt0">{"(pending.cursor, ctx);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"168"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"169"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"170"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"res"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"appFetch"}</span><span className="gdt0">{"("}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"171"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt2">{"\"/api/chat\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"172"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" { message: input.text, sessionId: ctx.session.id },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"173"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" ctx.signal,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"174"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" );"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"175"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"if"}</span><span className="gdt0">{" ("}</span><span className="gdt4">{"!"}</span><span className="gdt0">{"res.ok "}</span><span className="gdt4">{"||"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"!"}</span><span className="gdt0">{"res.body) {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"176"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"throw"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"new"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"Error"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"`POST /api/chat 失败: ${"}</span><span className="gdt0">{"res"}</span><span className="gdt2">{"."}</span><span className="gdt0">{"status"}</span><span className="gdt2">{"} ${"}</span><span className="gdt4">{"await"}</span><span className="gdt2">{" "}</span><span className="gdt0">{"res"}</span><span className="gdt2">{"."}</span><span className="gdt5">{"text"}</span><span className="gdt2">{"()."}</span><span className="gdt5">{"catch"}</span><span className="gdt2">{"(() "}</span><span className="gdt4">{"=>"}</span><span className="gdt2">{" "}</span><span className="gdt2">{"\"\""}</span><span className="gdt2">{")"}</span><span className="gdt2">{"}`"}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"177"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" }"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"178"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"return"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"drainStream"}</span><span className="gdt0">{"("}</span><span className="gdt5">{"sseJsonFrames"}</span><span className="gdt0">{"<"}</span><span className="gdt5">{"LanggraphFrame"}</span><span className="gdt0">{">(res.body), ctx);"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"179"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"}"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"180"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"181"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineAgent"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"182"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" name: "}</span><span className="gdt2">{"\"langgraph\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"183"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" evidenceCoverage,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"184"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt5">{"send"}</span><span className="gdt0">{": ("}</span><span className="gdt7">{"input"}</span><span className="gdt0">{", "}</span><span className="gdt7">{"ctx"}</span><span className="gdt0">{") "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" Effect."}</span><span className="gdt5">{"tryPromise"}</span><span className="gdt0">{"({ "}</span><span className="gdt5">{"try"}</span><span className="gdt0">{": () "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"(input, ctx), "}</span><span className="gdt5">{"catch"}</span><span className="gdt0">{": ("}</span><span className="gdt7">{"cause"}</span><span className="gdt0">{") "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" cause }),"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"185"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
|
|
82
82
|
</div>
|
|
83
83
|
</div>
|
|
84
84
|
|
|
@@ -113,13 +113,13 @@ langgraph/
|
|
|
113
113
|
<div className="gd-file">
|
|
114
114
|
<div className="gd-head"><span className="gd-name">{"evals/weather-tool.eval.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+27"}</span></span></div>
|
|
115
115
|
<div className="gd-body">
|
|
116
|
-
<table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineEval } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineJudge } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/expect\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { jsonMatch, pattern, toolMatch } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/expect\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"answerQuality"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineJudge"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" name: "}</span><span className="gdt2">{"\"answer-quality\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" rubric: "}</span><span className="gdt2">{"\"助手是否给出了具体的天气数据(温度或天气状况),而不是拒绝回答或含糊其辞?\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 这条 eval 验证 agent 遇到实时天气问题时调 get_weather,而不是直接编一个答案。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// get_weather 不是 gated 工具,它的 operation.started/operation.finished 完全来自 LangSmith span"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 派生,adapter 没有为它写一行帧映射(帧映射只补了 gated 的 calculate,见 agents/langgraph.ts)。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineEval"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"14"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" description: "}</span><span className="gdt2">{"\"测试 agent 在天气问题中正确调用 get_weather 并基于结果作答\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"15"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"16"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"test"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"t"}</span><span className="gdt0">{") {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"17"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"turn"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"北京今天天气怎么样?\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"18"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" turn."}</span><span className="gdt5">{"succeeded"}</span><span className="gdt0">{"()."}</span><span className="gdt5">{"orStop"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"19"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"20"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"group"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"调用 get_weather 且城市正确\""}</span><span className="gdt0">{", () "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"21"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"calledTool"}</span><span className="gdt0">{"("}</span><span className="gdt5">{"toolMatch"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"get_weather\""}</span><span className="gdt0">{", { input: "}</span><span className="gdt5">{"jsonMatch"}</span><span className="gdt0">{"({ city: "}</span><span className="gdt2">{"\"北京\""}</span><span className="gdt0">{" }) }));"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"22"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"check"}</span><span className="gdt0">{"(turn.
|
|
116
|
+
<table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineEval } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineJudge } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/expect\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { jsonMatch, pattern, toolMatch } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval/expect\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"answerQuality"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineJudge"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" name: "}</span><span className="gdt2">{"\"answer-quality\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" rubric: "}</span><span className="gdt2">{"\"助手是否给出了具体的天气数据(温度或天气状况),而不是拒绝回答或含糊其辞?\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 这条 eval 验证 agent 遇到实时天气问题时调 get_weather,而不是直接编一个答案。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// get_weather 不是 gated 工具,它的 operation.started/operation.finished 完全来自 LangSmith span"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"12"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 派生,adapter 没有为它写一行帧映射(帧映射只补了 gated 的 calculate,见 agents/langgraph.ts)。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"13"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineEval"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"14"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" description: "}</span><span className="gdt2">{"\"测试 agent 在天气问题中正确调用 get_weather 并基于结果作答\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"15"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"16"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"async"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"test"}</span><span className="gdt0">{"("}</span><span className="gdt7">{"t"}</span><span className="gdt0">{") {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"17"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"const"}</span><span className="gdt0">{" "}</span><span className="gdt1">{"turn"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"="}</span><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"send"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"北京今天天气怎么样?\""}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"18"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" turn."}</span><span className="gdt5">{"succeeded"}</span><span className="gdt0">{"()."}</span><span className="gdt5">{"orStop"}</span><span className="gdt0">{"();"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"19"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"20"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" "}</span><span className="gdt4">{"await"}</span><span className="gdt0">{" t."}</span><span className="gdt5">{"group"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"调用 get_weather 且城市正确\""}</span><span className="gdt0">{", () "}</span><span className="gdt4">{"=>"}</span><span className="gdt0">{" {"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"21"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"calledTool"}</span><span className="gdt0">{"("}</span><span className="gdt5">{"toolMatch"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"\"get_weather\""}</span><span className="gdt0">{", { input: "}</span><span className="gdt5">{"jsonMatch"}</span><span className="gdt0">{"({ city: "}</span><span className="gdt2">{"\"北京\""}</span><span className="gdt0">{" }) }));"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"22"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"check"}</span><span className="gdt0">{"(turn.reply, "}</span><span className="gdt5">{"pattern"}</span><span className="gdt0">{"("}</span><span className="gdt2">{"/"}</span><span className="gdt8">{"°C"}</span><span className="gdt4">{"|"}</span><span className="gdt8">{"气温"}</span><span className="gdt4">{"|"}</span><span className="gdt8">{"天气"}</span><span className="gdt4">{"|"}</span><span className="gdt8">{"晴"}</span><span className="gdt4">{"|"}</span><span className="gdt8">{"多云"}</span><span className="gdt4">{"|"}</span><span className="gdt8">{"雨"}</span><span className="gdt4">{"|"}</span><span className="gdt8">{"阴"}</span><span className="gdt2">{"/"}</span><span className="gdt0">{"));"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"23"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" });"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"24"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"25"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" t."}</span><span className="gdt5">{"judge"}</span><span className="gdt0">{"({ prompt: turn.input, answer: turn.reply }, answerQuality)."}</span><span className="gdt5">{"gate"}</span><span className="gdt0">{"("}</span><span className="gdt1">{"0.7"}</span><span className="gdt0">{");"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"26"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" },"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"27"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
|
|
117
117
|
</div>
|
|
118
118
|
</div>
|
|
119
119
|
|
|
120
120
|
<div className="gd-file">
|
|
121
121
|
<div className="gd-head"><span className="gd-name">{"experiments/langgraph.ts"}</span><span className="gd-stats"><span className="gd-plus">{"+11"}</span></span></div>
|
|
122
122
|
<div className="gd-body">
|
|
123
|
-
<table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineExperiment } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" agent "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"../agents/langgraph.ts\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 单配置基线:不比较模型,用 .env 里的默认模型(deepseek-v4-flash,经 OpenAI 兼容端点)。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// docs/origin-integration.md 的验收清单里,多模型对比只点名了 ai-sdk-v7 / claude-sdk /"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// pi-sdk 三个,这里不建 experiments/compare-models/。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineExperiment"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" description: "}</span><span className="gdt2">{"\"langgraph:真实 LangGraph + DeepSeek 后端\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" agent,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" attempts: "}</span><span className="gdt1">{"1"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
|
|
123
|
+
<table className="gd-table"><tbody><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"1"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" { defineExperiment } "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"niceeval\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"2"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"import"}</span><span className="gdt0">{" agent "}</span><span className="gdt4">{"from"}</span><span className="gdt0">{" "}</span><span className="gdt2">{"\"../agents/langgraph.ts\""}</span><span className="gdt0">{";"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"3"}</td><td className="gd-sign">{"+"}</td><td className="gd-code">{" "}</td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"4"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// 单配置基线:不比较模型,用 .env 里的默认模型(deepseek-v4-flash,经 OpenAI 兼容端点)。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"5"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// docs/origin-integration.md 的验收清单里,多模型对比只点名了 ai-sdk-v7 / claude-sdk /"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"6"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt6">{"// pi-sdk 三个,这里不建 experiments/compare-models/。"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"7"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt4">{"export"}</span><span className="gdt0">{" "}</span><span className="gdt4">{"default"}</span><span className="gdt0">{" "}</span><span className="gdt5">{"defineExperiment"}</span><span className="gdt0">{"({"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"8"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" description: "}</span><span className="gdt2">{"\"langgraph:真实 LangGraph + DeepSeek 后端\""}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"9"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" adapter: agent,"}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"10"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{" attempts: "}</span><span className="gdt1">{"1"}</span><span className="gdt0">{","}</span></td></tr><tr className="gd-add"><td className="gd-ln"></td><td className="gd-ln">{"11"}</td><td className="gd-sign">{"+"}</td><td className="gd-code"><span className="gdt0">{"});"}</span></td></tr></tbody></table>
|
|
124
124
|
</div>
|
|
125
125
|
</div>
|