dify/api/tests/unit_tests/services
dparkmit24 c881abff0c fix(agent): show one log entry per call when a tool repeats in a turn
The console agent log builds one entry per name in the ";"-joined tool
column, then looks each name up in a dict keyed by tool name. A tool
called twice in one turn produced two entries reading the same key, so
both showed the same data -- the display the reproduction in #16220
describes.

Keeping every call's input and observation apart, as this branch already
did, changed what those two entries show without making them right: each
one showed both calls' data instead of one call's data twice.

Read the persisted payloads per call instead. MessageAgentThought now
exposes tool_inputs_per_call, tool_outputs_per_call and
tool_metas_per_call, one entry per entry in tools, in call order, and
get_agent_logs walks them alongside the names. A name whose stored value
is not one value per call gives the same value to each of its calls, so
every record written before those calls were kept apart renders exactly
as it renders today.

That makes tool_invoke_meta safe to group the same way, which it now is.
It carries the provider, the duration and the error the log shows for
each displayed call, so leaving it name-keyed would have left a repeated
tool showing the last call's provider and duration against both entries.
Its other reader, the tool trace, covers the tool rather than one call of
it and takes the last call's meta -- the only one it had before.

The occurrence selector moves to models.model so the reader that builds
the log and the reader that replays history share one definition. Its
behaviour is unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 09:47:17 -07:00
..
agent fix(agent): expose feedback in agent logs (#39994) 2026-08-04 14:11:13 +00:00
auth fix(auth): add bounded timeout to WaterCrawl credential validation (#39824) 2026-07-31 13:52:02 +00:00
data_migration test: use SQLite sessions in services data_migration (#39065) 2026-07-30 02:41:42 +00:00
enterprise feat: gate agent management behind the agent.manage permission (#39330) 2026-07-23 07:34:07 +00:00
openapi feat: adding dify cli (#36348) 2026-05-26 01:12:36 +00:00
plugin feat(api): isolate credentials from local packages (#39957) 2026-08-04 02:50:04 +00:00
rag_pipeline feat(workflow): support LLM environment variables (#39125) 2026-08-04 06:17:13 +00:00
recommend_app test: move recommendation database retrieval coverage to unit tests (#38921) 2026-07-15 03:44:36 +00:00
retention chore: bump pyrefly version (#39876) 2026-08-03 05:59:01 +00:00
tools test: use SQLite sessions in services tools (#39063) 2026-07-30 02:39:55 +00:00
workflow feat(workflow): support human input in loop and iteration (#39243) 2026-08-03 02:24:18 +00:00
__init__.py FEAT: NEW WORKFLOW ENGINE (#3160) 2024-04-08 18:51:46 +08:00
controller_api.py refactor(api): migrate workspace tool endpoints to BaseModel (#37959) 2026-07-08 09:56:04 +00:00
dataset_service_test_helpers.py refactor: explicit DB session propagation across backend paths (#38559) 2026-07-15 06:48:28 +00:00
document_service_validation.py refactor: explicit DB session propagation across backend paths (#38559) 2026-07-15 06:48:28 +00:00
hit_service.py test: use SQLite sessions in services misc (#39114) 2026-07-22 02:11:52 +00:00
test_account_service.py test: migrate account service tests to shared SQLite (#39758) 2026-07-29 11:43:32 +00:00
test_agent_app_feature_service.py test: use sqlite3 session in test_agent_app_feature_service (#38724) 2026-07-28 06:32:07 +00:00
test_agent_app_sandbox_service.py refactor: introduce agent working environment architecture (#39480) 2026-07-28 13:16:05 +00:00
test_agent_config_service.py fix(agent): preserve DSL asset placeholders and count draft references (#39015) 2026-07-15 11:49:11 +00:00
test_agent_drive_service.py test: use sqlite3 session in test_agent_drive_service (#38709) 2026-07-14 04:06:43 +00:00
test_agent_service.py fix(agent): show one log entry per call when a tool repeats in a turn 2026-08-05 09:47:17 -07:00
test_agent_tool_inner_service.py test: use SQLite sessions in services core (#39111) 2026-07-22 02:15:01 +00:00
test_annotation_service.py fix(api): bind scoped lookups to nested owner refs (#38470) 2026-07-15 09:31:09 +00:00
test_api_token_service.py test: move API token service coverage to unit tests (#38918) 2026-07-21 07:48:10 +00:00
test_app_dsl_service.py feat(workflow): support LLM environment variables (#39125) 2026-08-04 06:17:13 +00:00
test_app_generate_service_streaming_integration.py refactor: improve stream close 2 (#37106) 2026-06-23 03:32:33 +00:00
test_app_generate_service.py refactor: explicit DB session propagation across backend paths (#38559) 2026-07-15 06:48:28 +00:00
test_app_model_config_service.py refactor: explicit DB session propagation across backend paths (#38559) 2026-07-15 06:48:28 +00:00
test_app_service.py refactor: introduce agent working environment architecture (#39480) 2026-07-28 13:16:05 +00:00
test_app_task_service.py feat(api): Agent App type S1 — AppMode.AGENT + create flow + binding (#36829) 2026-06-02 03:50:10 +00:00
test_archive_workflow_run_logs.py feat(retention): add V2 workflow run archive bundlesa (#37747) 2026-06-23 15:20:25 +08:00
test_async_workflow_service.py test: use sqlite3 session in test_async_workflow_service (#38692) 2026-07-23 03:34:10 +00:00
test_audio_service.py fix(api): bind scoped lookups to nested owner refs (#38470) 2026-07-15 09:31:09 +00:00
test_batch_indexing_base.py chore: bump pyrefly version (#39876) 2026-08-03 05:59:01 +00:00
test_billing_service.py fix(api): bound billing service HTTP timeouts (#39874) (#39875) 2026-08-01 10:46:13 +00:00
test_clear_free_plan_expired_workflow_run_logs.py refactor: optimize free plan workflow run cleanup batching (#37227) 2026-06-17 03:19:26 +00:00
test_clear_free_plan_tenant_expired_logs.py test: use sqlite3 session in test_clear_free_plan_tenant_expired_logs (#38693) 2026-07-22 04:16:21 +00:00
test_code_based_extension_service.py test: add tests for some files in services module (#32583) 2026-03-11 14:21:56 +08:00
test_conversation_service.py refactor: introduce agent working environment architecture (#39480) 2026-07-28 13:16:05 +00:00
test_credential_permission_service.py test: exercise credential visibility with SQLite (#39827) 2026-07-31 03:20:21 +00:00
test_credit_pool_service.py feat: improve ai-credits display (#38589) 2026-07-16 01:51:46 +00:00
test_dataset_service_dataset.py fix(dataset_service): use flush() instead of commit() to preserve caller transaction (#39223) 2026-07-19 07:00:50 +00:00
test_dataset_service_document.py perf(dataset): fix N+1 database insert bottleneck in Notion sync (#39899) 2026-08-03 00:57:22 +00:00
test_dataset_service_lock_not_owned.py test: use sqlite3 session in test_dataset_service_lock_not_owned (#38755) 2026-07-14 06:40:31 +00:00
test_dataset_service_segment.py fix(api): scope segment batch deletes (#38217) 2026-08-01 01:39:40 +00:00
test_datasource_provider_service.py test: use sqlite3 session in test_datasource_provider_service (#38695) 2026-07-25 03:16:43 +00:00
test_document_indexing_task_proxy.py chore(api): Fix several typing errors (#37248) 2026-06-12 14:02:09 +00:00
test_duplicate_document_indexing_task_proxy.py chore(api): Fix several typing errors (#37248) 2026-06-12 14:02:09 +00:00
test_export_app_messages.py feat: add export app messages (#32990) 2026-03-07 11:27:15 +08:00
test_external_dataset_service.py fix(api): allow external knowledge base creation under enterprise RBAC (#39930) 2026-08-04 04:50:43 +00:00
test_feature_service_app_dsl_version.py chore: split to single app_dsl_version API (#36864) 2026-05-31 12:13:44 +00:00
test_feature_service_change_email.py refactor: centralize deployment edition in system features (#39454) 2026-07-24 07:15:02 +00:00
test_feature_service_deployment_edition.py refactor: centralize deployment edition in system features (#39454) 2026-07-24 07:15:02 +00:00
test_feature_service_enable_app_deploy.py refactor: centralize deployment edition in system features (#39454) 2026-07-24 07:15:02 +00:00
test_feature_service_explore_banner.py perf(web): streaming ssr for home page (#39922) 2026-08-04 02:16:08 +00:00
test_feature_service_human_input_email_delivery.py chore: seprate vector space quota query (#36514) 2026-05-22 09:26:17 +00:00
test_feature_service_internal_policies.py refactor: remove backend-only system feature fields (#39543) 2026-07-25 02:01:12 +00:00
test_feature_service_knowledge_fs.py refactor: centralize deployment edition in system features (#39454) 2026-07-24 07:15:02 +00:00
test_feature_service_learn_app.py refactor: centralize deployment edition in system features (#39454) 2026-07-24 07:15:02 +00:00
test_feature_service_licensed_seats.py refactor: centralize deployment edition in system features (#39454) 2026-07-24 07:15:02 +00:00
test_feature_service_plugin_installation_permission.py fix: validate plugin installation scope (#39669) 2026-07-28 04:13:20 +00:00
test_feature_service_trial_models.py chore: split trial models to a single API (#36796) 2026-05-31 13:09:13 +00:00
test_feature_service_vector_space.py chore: backend feature api exclude_vector_space (#36642) 2026-05-26 08:50:54 +00:00
test_feature_service_webapp_public_access.py refactor: centralize deployment edition in system features (#39454) 2026-07-24 07:15:02 +00:00
test_feedback_service.py test: move feedback service coverage to unit tests (#38927) 2026-07-15 05:42:12 +00:00
test_file_request_service.py feat(agent): separate CLI file URL audiences (#39952) 2026-08-04 13:14:02 +00:00
test_file_service.py test: use SQLite sessions in services core (#39088) 2026-07-28 03:18:32 +00:00
test_hit_testing_service.py test: move hit testing service coverage to unit tests (#38925) 2026-07-15 03:37:16 +00:00
test_human_input_delivery_test_service.py test: move human input delivery coverage to unit tests (#38926) 2026-07-21 08:18:32 +00:00
test_human_input_file_upload_service.py chore(api): upgrade graphon to v0.6.0, migrate HITL logic back to Dify (#38247) 2026-07-03 03:45:21 +00:00
test_human_input_service.py test: share unbound unit test sessions (#39690) 2026-07-28 14:12:08 +00:00
test_knowledge_fs_proxy.py feat(dataset): add crawl source selection (#39325) 2026-07-24 07:11:48 +00:00
test_knowledge_retrieval_inner_service.py test: use SQLite sessions in services core (#39112) 2026-07-16 09:32:11 +00:00
test_knowledge_service.py refactor: replace dict with BedrockRetrievalSetting BaseModel in knowledge_service (#34080) 2026-03-25 21:33:24 +09:00
test_message_service.py test: use sqlite3 session in test_message_service (#38698) 2026-07-27 02:01:47 +00:00
test_messages_clean_service.py test(api): manage backend pytest services natively (#36235) 2026-05-19 07:52:15 +00:00
test_metadata_bug_complete.py test: use sqlite3 session in test_metadata_bug_complete (#38721) 2026-07-29 05:50:26 +00:00
test_metadata_nullable_bug.py test: use sqlite3 session in test_metadata_nullable_bug (#38717) 2026-07-25 14:05:52 +00:00
test_metadata_service_session_boundary.py refactor: explicit DB session propagation across backend paths (#38559) 2026-07-15 06:48:28 +00:00
test_model_load_balancing_service.py feat(workflow): support human input in loop and iteration (#39243) 2026-08-03 02:24:18 +00:00
test_model_provider_service_sanitization.py chore: reorg imports (#35308) 2026-04-16 08:50:02 +00:00
test_model_provider_service.py feat(workflow): support human input in loop and iteration (#39243) 2026-08-03 02:24:18 +00:00
test_oauth_device_flow.py test: use sqlite3 session in test_oauth_device_flow (#38782) 2026-07-13 07:48:15 +00:00
test_oauth_server_service.py test: move OAuth server service coverage to unit tests (#38931) 2026-07-28 04:09:32 +00:00
test_operation_service.py fix: bound OperationService billing requests (#37425) 2026-06-22 06:45:03 +00:00
test_rag_pipeline_task_proxy.py chore: add Type to test (#37191) 2026-06-19 16:44:20 +00:00
test_recommended_app_service.py refactor: move trial app capability out of system features (#39562) 2026-07-26 12:02:30 +00:00
test_schedule_service.py test: use sqlite3 session in test_schedule_service (#38707) 2026-07-14 03:43:19 +00:00
test_snippet_dsl_service.py refactor: introduce agent working environment architecture (#39480) 2026-07-28 13:16:05 +00:00
test_snippet_generate_service.py refactor: explicit DB session propagation across backend paths (#38559) 2026-07-15 06:48:28 +00:00
test_snippet_service.py feat(workflow): support LLM environment variables (#39125) 2026-08-04 06:17:13 +00:00
test_step_by_step_tour_service.py feat(web): add step-by-step tour shell (#38785) 2026-07-20 09:23:25 +00:00
test_summary_index_service.py refactor: explicit DB session propagation across backend paths (#38559) 2026-07-15 06:48:28 +00:00
test_telemetry_service.py feat: add CE telemetry report (#39452) 2026-07-27 02:04:28 +00:00
test_trigger_provider_service.py test: use SQLite sessions in services core (#39057) 2026-07-27 09:36:44 +00:00
test_variable_truncator_additional.py chore(api): convert BaseTruncator from ABC to Protocol (#37199) 2026-06-09 02:55:36 +00:00
test_variable_truncator.py fix(api): honor array-element limit and byte budget for list[File] in VariableTruncator (#39218) (#39220) 2026-07-27 02:12:57 +00:00
test_vector_service.py refactor: explicit DB session propagation across backend paths (#38559) 2026-07-15 06:48:28 +00:00
test_webhook_service_additional.py refactor(tests): replace mock_logger with caplog in 5 service tests (#37468) (#37715) 2026-06-22 05:53:51 +00:00
test_webhook_service.py test: use sqlite3 session in test_webhook_service (#38699) 2026-07-25 13:52:42 +00:00
test_website_service.py fix(api): bound JinaReader and adaptive-crawl HTTP timeouts (#39859) (#39860) 2026-08-02 02:49:17 +00:00
test_workflow_app_service_metadata.py test: move workflow app service coverage to unit tests (#38946) 2026-07-28 05:34:59 +00:00
test_workflow_collaboration_service.py test: use SQLite sessions in unit misc (#39119) 2026-07-21 03:20:59 +00:00
test_workflow_comment_service.py test: use sqlite3 session in test_workflow_comment_service (#38700) 2026-07-27 08:22:45 +00:00
test_workflow_generator_service.py perf(workflow-generator): parallelize node config generation (#38975) 2026-07-17 02:34:15 +00:00
test_workflow_node_execution_trace_service.py fix: preserve and display workflow retry details (#38854) 2026-07-15 05:58:37 +00:00
test_workflow_run_service_pause.py test: use SQLite sessions in services core (#39090) 2026-07-28 03:20:27 +00:00
test_workflow_run_service.py test: use sqlite3 session in test_workflow_run_service (#38701) 2026-07-27 08:19:32 +00:00
test_workflow_service.py feat(workflow): support LLM environment variables (#39125) 2026-08-04 06:17:13 +00:00