Commit Graph
93 Commits
Author SHA1 Message Date
Eric Wang f9ec20cd81 Merge branch 'main' into langgraph-migration 2026-10-22 11:30:15 +08:00
Eric Wang c7ca781b28 perf(workflow): move photo and confirmation data to prompt tails 2026-10-22 11:26:15 +08:00
Eric Wang dd45c9d870 perf(workflow): move dynamic context out of fixed prompts 2026-10-22 10:58:20 +08:00
Eric Wang b0ff2e03b6 fix(workflow): align collection and extraction prompts for 20261022 2026-10-22 10:30:57 +08:00
Eric Wang 9e28f69b3c feat(agent): trusted time evidence and collection prompt optimization
- time_context.py: server-side observation clocks for relative-time
  evidence (anti client-forgery); resolves X分钟前/小时前 against the
  observation timestamp of the turn that produced them, never re-basing
  history on the current clock; flags historical references without a
  reliable baseline
- state: dialogue_timestamps keyed by dialogue message index, persisted
  with checkpoint; welcome seeds index 0
- collect: single clock per turn shared by reply/extraction/repair;
  time_evidence injected into runtime context; reply_validator hook
  rejects time claims lacking evidence (one shared repair budget);
  model still interprets facts and chooses actions
- prompts: collection prompt restructured (shorter, state-bound-to-action
  table, gatekeeper principle, time source rules); extraction prompt
  aligned; workflow@20261021 json updated to match
- evals: prompt_probes / prompt_compare / time_boundary probe scripts
  (supplementary checks, original cases untouched)
- docs: collection-prompt-optimization.md (method + baselines),
  time-boundary-fix.md (problem, design, verification)
- gitignore: editor artifact dirs (.agents/.claude/.vscode, skills-lock)

Verified: 171 unit tests pass (16 new time-context tests)
2026-10-22 09:41:32 +08:00
Eric Wang a890f41f6f chore(prompts): regenerate collection prompt from workflow@20261021-r2
- merge main (fb9271e): collection prompt restructured (state-bound-to-action,
  gatekeeper principle); fill_missing eval cases relaxed to semantic regexes
- prompts/collection.md regenerated; byte-identity test updated and passing
- rerun golden evals: collection_skip 11/12, time_confirmation 1/2
  (inter-run variance; only single_no_inferred_count fails consistently -
  model routes without asking vehicle count after time confirmation)
2026-10-21 17:28:44 +08:00
Eric Wang 894cb220ed Merge branch 'main' into langgraph-migration 2026-10-21 17:13:10 +08:00
Eric Wang 74db6be385 feat(agent): form pipeline + collection prompt workflow@20261021
- merge main: workflow/20261021 (collection prompt adds step-5 mandatory
  time readback-confirm before routing; non-motor/0003 branch rework;
  accident_cause unified schema), updated eval suites (photo_skip/
  button_guidance rewritten, no_false trimmed to asr, new
  non_motor_vehicle + time_confirmation with form/reply assertions),
  runner gains form/formMatches/replyMatches expectations
- prompts/collection.md regenerated from 20261021; extraction prompt
  archived (contentExtract description, 6-key whitelist)
- collect: extraction call per turn (extraction.md + current time/form
  injected), merge follows 更新表单 semantics (meaningful values only,
  number/string equality, diff -> turn_patch); accident_fields now uses
  external form keys
- backend: form_update flows to ChatResult and SSE formUpdate event
  (stream emits prefix, FormUpdate, body)
- fields: FORM_FIELDS whitelist with strict type validation
- verified: 155 unit tests; golden evals on real model - photo_skip 4/4,
  no_false 2/2, photo_button_guidance 12/12, non_motor_vehicle 14/14,
  collection_skip 10/12, time_confirmation 1/2; remaining 3 failures are
  model sequence/literal-template adherence, recorded in plan appendix
2026-10-21 17:10:33 +08:00
Eric Wang fb9271efc5 fix(workflow): bind collection states to actions and relax eval wording 2026-10-21 16:51:19 +08:00
Eric Wang 4ead44ef3f Merge branch 'main' into langgraph-migration 2026-10-21 15:42:04 +08:00
Eric Wang 248eb41c78 fix(workflow): align non-motor accident extraction and evaluations 2026-10-21 15:34:11 +08:00
Eric Wang 11cffa01c9 docs: record progress, decisions and open questions in migration plan
- plan: assignment status table, five landed architecture decisions
  (propose-validate, context_schema DI, verbatim alignment, no LangGraph
  Server/SDK with rationale, 2004 semantics), real-model eval results
  (collection 12/12; photo_skip 0/4 and no_false 2/8 share the '对'
  routing pattern), three open questions with next actions, code map
- 2004 task rewritten as plate-confirm with both paths whitelisted
- graduation requirement reworded: illegal transitions never committed
- README: current status section pointing to plan appendix
2026-10-21 15:11:19 +08:00
Eric Wang 6d0a2169c8 refactor(agent): inject deps via context_schema, LLM-driven photo/confirm nodes
- graph.py: LangGraph-native DI - StateGraph(context_schema=GraphDeps),
  nodes take (state, runtime: Runtime[GraphDeps]); build_graph() decoupled
  from LLM; deleted scaffold _event_reply/_fake_llm_propose/stub nodes
- photo.py: model proposes stage+body via per-mode prompts (direct/addon);
  validator enforces clientMode exits; deterministic event forcing removed
- confirm.py: single runtime for single/dual confirm, extraction call
  isolated per person_index
- llm.py: workflow_fake_llm() (offline workflow-faithful responder,
  history-aware) for smoke/tests
- backend: LangGraphBackend(graph, llm) passes context per call
- tests: invoke helpers inject GraphDeps; illegal-proposal test asserts
  error + state untouched via second well-behaved fake

Verified: 143 passed; smoke turns 1/2/1 with original welcome text
2026-10-21 15:11:16 +08:00
Eric Wang a5407e03b2 feat(agent): align prompts and runtime with workflow@20261020
- archive workflow/20261020 export (diff vs 20261016: collection prompt
  only - state-decides-body rule, route when info complete)
- prompts: collection.md updated; 6 photo/confirm prompts archived with
  source nodeIds; render_prompt replaces {{$vars}} (Asia/Shanghai clock,
  person fields, explicit 'not provided' for missing prefills)
- llm: message history passed as user/assistant roles (chatNode history=50);
  optional LLM_TEMPERATURE; FakeLLMService supports history-aware responders
- collect: context via system supplement, raw user input as user message
  (Text Editor#2 parity), shared validated_reply (one call, one repair)
- welcome: Assigned Reply#3 original text, stored in dialogue history
- transitions: 2004 plate-confirm entries (2003->2004/2005, 2004->2005)
- verified: prompt files byte-identical to workflow JSON (parametrized test)
2026-10-21 15:10:51 +08:00
Eric Wang 1c6b1a513d feat(agent): LLM-powered collection node with welcome stage and session-scoped delete (assignment 4)
- prompts/collection.md: versioned collection system prompt extracted
  from workflow node yQaBxfrWjbRr with source/version/porting notes
- llm.py: LLMService protocol; FakeLLMService (scripted, records
  calls); OpenAILLMService (async, wait_for timeout with cancellation,
  retry only on timeout/429/connection, errors normalized)
- collect.py: run_collect reference impl - one LLM call produces
  state prefix + body, controlled repair (max 1 retry) for missing
  prefix or illegal stage proposal, whitelist guard, CollectReplyError
  without raw model content; dialogue history + confirmed fields
  injected into prompt so the model skips known info (作业4-5)
- fields.py / clock.py: three-state field candidates (unknown/
  candidate/confirmed), per-type validation (count not inferred from
  description, future time rejected), injectable Clock
- graph.py: welcome node - first message returns fixed 1001 greeting
  without LLM (mirrors workflow is_first_message -> Assigned Reply#3),
  route empty stage to welcome
- endpoints/delete_session: backend switch - langgraph clears graph
  checkpoint, fastgpt path unchanged
- config: AGENT_LLM_PROVIDER fake|openai with validation
- untrack .env (secrets), move template to root .env.example

Verified:
- pytest 103 passed; smoke turns 1/2/1
- Real LLM e2e: POST /chat multi-turn context works
- Golden eval collection_skip_known_info: 12/12 cases pass
- Golden eval no_false: 8/10 cases pass; 4 confirm/photo cases fail
  at final step - model routes on short reply '对' (prompt-adherence
  gap, photo/confirm stages are assignment 5 scope); recorded in
  evals/results/20261020-144856

Known limits: field extraction from model reply not wired (stub);
photo/confirm nodes still scaffold; clarify counting is approximate.
2026-10-20 14:53:46 +08:00
Eric Wang 8323d53a70 feat(agent): domain events and transition whitelist validation (assignment 3)
Architecture (mirrors workflow/20261016 chatNode structure):
- events.py: client markers parsed to typed ClientEvent (sources
  verified against workflow JSON); plain text like '拍好了' is not an event
- transitions.py: LEGAL_TRANSITIONS whitelist drafted from chatNode
  prompts and Condition edges (16 entries, each with source_ref);
  is_legal_transition rejects unlisted/terminal-violating moves
- graph.py: multi-node graph (collect/single_photo/dual_photo/...
  matching workflow chatNodes), route_by_stage conditional edges,
  _fake_llm_propose simulates LLM stage-code proposals (assignment 4
  replaces with real LLM); code only keeps context bookkeeping
  (no_reply_count) and validation
- state.py: expanded domain fields (pending_question, accident/
  person fields, clarify/no-reply counts, turn_patch, state_version)

Key finding: 单车拍照#6/双车拍照#7 are browser_addon branches ending
at 0000, so 2005/2015 allow both 300x (direct) and 0000.

Verified: pytest 87 passed (24 transition/event tests newly green).
Known limit: stage proposals come from a fake LLM; per-stage scripts
and real LLM integration are assignments 4-5.
2026-10-19 16:25:04 +08:00
Eric Wang 5d68b731d4 feat(backends): wire LangGraph backend behind AGENT_BACKEND switch (assignment 2)
- src/backends/langgraph.py: LangGraphBackend implements ChatBackend;
  complete() runs one graph turn per session (thread_id=sessionId) and
  returns state-prefixed content; stream() emits the full state prefix
  before body fragments (full-answer slicing, not yet real incremental
  output - assignment 8)
- src/core/config.py: AGENT_BACKEND=fastgpt|langgraph, langgraph mode
  no longer requires FastGPT credentials at startup
- src/core/fastgpt_client.py: lifespan builds the backend by switch
- test/backends/test_langgraph_backend.py: adapter acceptance tests

Verified:
- pytest: 48 passed
- AGENT_BACKEND=langgraph uvicorn: POST /chat -> 1002;
  browser_addon -> browser_addon.1002; SSE = stage_code, text_delta,
  single done

Known limit: stream slices a complete answer; no formUpdate deltas yet
(assignment 6).
2026-10-19 14:29:31 +08:00
Eric Wang 5020903791 feat(agent): add LangGraph scaffold for assignment 1
- src/agent/state.py: minimal five-field AgentState
- src/agent/graph.py: START -> normalize_input -> reply -> END,
  compiled with InMemorySaver; reply emits <state>1002</state> prefix
- examples/langgraph_smoke.py: offline smoke, turns 1/2/1 verified
- test/agent/test_scaffold.py: turn accumulation, thread isolation,
  fixed-template assertions (3 passed)
- requirements.txt: pin langgraph==1.2.9

Known limit: InMemorySaver state disappears on process exit.
2026-10-19 13:32:43 +08:00
Eric Wang a9a1393f64 test: align backend boundary and schema contract tests with current behavior 2026-10-19 13:32:34 +08:00
Eric Wang a6ce570499 docs: add project README, env guide and assignment baseline notes 2026-10-19 13:32:31 +08:00
Eric Wang 3fe99e71fd remove root dir .env 2026-10-16 17:02:02 +08:00
Eric Wang dea2ea5b71 feat(workflow): add new workflow for accident information collection
- Introduced a comprehensive JSON configuration for a new workflow that includes user guidance, input handling, and AI chat integration.
- The workflow features nodes for system configuration, workflow start, and accident information collection, enhancing user interaction and data collection capabilities.
- Implemented various input types and configurations to support dynamic user interactions and improve overall workflow efficiency.
2026-10-16 17:01:47 +08:00
Eric Wang 81b2335d9e docs: rewrite LangGraph migration plan as staged assignments 2026-10-16 16:15:18 +08:00
Eric Wang 89cc965b5a Merge remote-tracking branch 'gitea/main' into langgraph-migration 2026-10-16 16:02:35 +08:00
Eric Wang 6b8a548df3 fix(workflow): offer photo button guidance only when needed 2026-10-16 15:58:41 +08:00
Eric Wang 5f60093eee Merge branch 'main' into langgraph-migration 2026-10-16 15:51:29 +08:00
Eric Wang 22853f1b5a fix(workflow): skip known accident details and guide off-topic replies 2026-10-16 15:16:16 +08:00
Eric Wang 4787d6eb79 fix(workflow): skip plate confirmation after photos and guide driver verification 2026-10-16 14:21:45 +08:00
Eric Wang ee7bff32dd feat(workflow): add October 16 accident information collection workflow 2026-10-16 11:33:04 +08:00
Eric Wang f179d9ffb0 fix(prompt): 新增状态码语义权威规则与不在现场分支
- 1002 状态下正文严禁出现转人工表述,以状态码为准
- 补全步骤6'不在现场'分支:记录后保持1002继续收集
- 最终输出自检增加状态码-正文一致性检查
2026-10-14 18:05:54 +08:00
Eric Wang e26e724a53 Add new prompt file for traffic accident reporting AI
- Introduced a comprehensive prompt file detailing the role and operational guidelines for a traffic accident reporting AI.
- Established strict output formatting rules to ensure clarity in user interactions, including state management and response protocols.
- Emphasized safety prioritization and robust handling of user inputs, particularly regarding the assessment of potential injuries and the transition to human assistance.
2026-10-12 10:42:28 +08:00
Eric Wang 34d09f53bb Merge branch 'main' of http://182.92.86.220:8300/wx44wx/ZNJJ-api-server
# Conflicts:
#	docs/视频快处智能信息采集机器人交互接口文档V1.0.10.docx
#	src/api/endpoints.py
#	src/core/fastgpt_client.py
2026-10-11 21:39:49 +08:00
Xin Wang e261e97916 Update form extraction logic in endpoints.py
- Changed the module name for form extraction to "更新表单" for clarity.
- Enhanced the extraction process to accommodate various output formats from nodes, ensuring compatibility with different structures.
- Improved handling of empty or invalid form updates, returning an empty object when necessary to maintain robustness.
2026-08-11 14:58:47 +08:00
Xin Wang bfc91b6f66 Remove outdated document for version 1.0.10 of accident reporting AI, streamlining the repository and eliminating unnecessary files. 2026-07-30 14:20:21 +08:00
Xin Wang f40643dd87 Refine prompts and evaluation cases for accident reporting AI
- Updated prompts to enhance clarity and consistency in user interactions, particularly focusing on safety prioritization and accurate information collection.
- Introduced new YAML evaluation cases to test various user input scenarios, ensuring robust handling of short, ambiguous, or irrelevant responses.
- Enhanced guidelines for transitioning to human assistance, emphasizing strict conditions for triggering state changes based on user responses.
2026-07-30 14:19:57 +08:00
Xin Wang be35e48686 Add user interaction guidelines for online confirmation in accident reporting prompts
- Introduced new section for user inputs that confirm system availability, detailing specific phrases that indicate active engagement.
- Clarified response protocol for such inputs, ensuring the system maintains its current state and provides brief confirmations.
- Enhanced overall user experience by addressing common interaction scenarios in the accident reporting process.
2026-07-29 12:43:03 +08:00
Xin Wang 4e621e2f0c Enhance evaluation runner with transcript handling and new case formats
- Updated the evaluation runner to support live dialogue printing and transcript saving in both Markdown and JSON formats.
- Introduced new data classes for managing transcripts and their components, improving structure and readability.
- Modified existing YAML case files to align with the new direct client mode and updated stage codes.
- Added new test cases for the direct client mode, ensuring comprehensive coverage of user interactions.
2026-07-29 11:13:07 +08:00
Xin Wang e6437ab332 Move workflow evaluations to standalone runner 2026-07-29 10:35:45 +08:00
Xin Wang 3187713bfe Enhance client mode handling in ProcessRequest_chat
- Introduced a normalization function for client mode to default to "direct" when input is empty or None.
- Updated the clientMode field to use a new type with BeforeValidator for improved validation.
- Added a test to ensure empty client mode inputs correctly default to "direct".
2026-07-29 10:02:35 +08:00
Xin Wang 473fffd2f0 Add new prompts for traffic accident reporting AI
- Introduced two new prompt files for traffic accident reporting, detailing the interaction protocol and state management for both single and dual vehicle scenarios.
- Established strict output formatting rules to ensure clarity and consistency in user interactions, including handling of user responses.
- Enhanced guidelines for safety prioritization and accurate information collection during the accident reporting process.
2026-07-28 17:34:22 +08:00
Xin Wang 08e290bcdf Update prompts for vehicle accident reporting
- Revised state codes to enhance clarity in user interactions, replacing previous codes with new ones indicating successful verification and transition to human assistance.
- Adjusted output messages to reflect the updated state management, ensuring a smoother user experience during the information confirmation phase.
- Improved guidelines for handling user responses, emphasizing accurate information collection and efficient transition to human support.
2026-07-28 15:41:21 +08:00
Xin Wang f99c171418 Add new prompts for dual vehicle accident scene guidance
- Introduced a detailed prompt file for dual vehicle accident photo capture and verification, outlining the interaction protocol and state management.
- Established strict output formatting rules to ensure clarity and consistency in user interactions.
- Included comprehensive guidelines for handling various user responses, prioritizing accurate information collection during dual vehicle accident reporting.
2026-07-28 15:19:23 +08:00
Xin Wang 5501913779 Add new prompt for traffic accident reporting AI
- Introduced a detailed prompt file for a traffic accident reporting AI, outlining the interaction protocol and state management.
- Established strict output formatting rules to ensure clarity and consistency in user interactions.
- Included comprehensive guidelines for handling various user responses, prioritizing safety and accurate information collection during accident reporting.
2026-07-28 15:18:53 +08:00
Xin Wang 7ed45089ec Add new prompt for traffic accident reporting AI
- Introduced a comprehensive prompt file for a traffic accident reporting AI, detailing the interaction protocol and state management.
- Established strict output formatting rules to ensure clarity and consistency in user interactions.
- Included guidelines for handling various user responses, emphasizing safety and accurate information collection during accident reporting.
2026-07-28 15:08:18 +08:00
Xin Wang 9301507b08 Add live stage-code golden tests 2026-07-28 13:45:43 +08:00
Xin Wang 776f6e82b3 Add new documentation for version 1.0.10
- Introduced a comprehensive document detailing the interaction interface design for the intelligent information collection robot.
- Updated version history with new features, including the addition of the clientMode parameter and its impact on output formatting.
- Enhanced clarity in the API request and response structures, including examples for better understanding of the interaction flow.
2026-07-28 11:10:50 +08:00
Xin Wang be6af046ca Simplify client mode to single FastGPT app 2026-07-28 10:38:01 +08:00
Xin Wang 3e9385b0ca Add client-mode FastGPT routing 2026-07-28 08:41:34 +08:00
Eric Wang 5c719ed2ea Refactor chat backend integration and introduce new backend-neutral architecture
- Replaced direct FastGPT client usage with a backend-neutral chat interface, allowing for improved flexibility and maintainability.
- Introduced a new `ChatBackend` protocol and implemented `FastGPTBackend` to handle chat operations.
- Updated the chat endpoint to utilize the new backend structure, enhancing the handling of chat requests and responses.
- Added comprehensive tests to ensure compatibility and functionality of the new backend integration.
2026-07-26 07:25:24 +08:00
Eric Wang 893eb2f2f7 Update environment variables and add LangGraph backend migration plan
- Updated ANALYSIS_AUTH_TOKEN and APP_ID in the .env file for enhanced security and configuration.
- Added a comprehensive migration plan document for transitioning the LangGraph backend, detailing the background, scope, goals, and architectural decisions for the project.
2026-07-26 07:24:30 +08:00