sycommon-python-lib 0.2.0b25__tar.gz → 0.2.0b26__tar.gz
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.
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/PKG-INFO +11 -11
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/pyproject.toml +11 -11
- sycommon_python_lib-0.2.0b26/src/sycommon/agent/__init__.py +38 -0
- sycommon_python_lib-0.2.0b26/src/sycommon/agent/examples/virtual_employee_demo.py +463 -0
- sycommon_python_lib-0.2.0b26/src/sycommon/agent/exports.py +107 -0
- sycommon_python_lib-0.2.0b26/src/sycommon/agent/skills/__init__.py +18 -0
- sycommon_python_lib-0.2.0b26/src/sycommon/agent/skills/examples/faq_handler/scripts/search.py +68 -0
- sycommon_python_lib-0.2.0b26/src/sycommon/agent/skills/exports.py +78 -0
- sycommon_python_lib-0.2.0b26/src/sycommon/agent/virtual_employee.py +774 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +5 -3
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon_python_lib.egg-info/PKG-INFO +11 -11
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon_python_lib.egg-info/SOURCES.txt +6 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon_python_lib.egg-info/requires.txt +10 -10
- sycommon_python_lib-0.2.0b25/src/sycommon/agent/__init__.py +0 -62
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/README.md +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/01_basic_agent.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/02_tool_agent.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/03_structured_output.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/04_memory_agent.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/05_streaming.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/06_multi_agent.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/07_skills_agent.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/08_middleware.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/09_interrupt.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/10_custom_llm.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/11_complex_workflow.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/12_batch_processing.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/middleware/01_basic_monitoring.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/middleware/02_permission_control.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/middleware/03_tool_skill_filter.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/middleware/04_caching_retry.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/middleware/05_sanitization.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/middleware/06_tracking.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/middleware/07_advanced.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/middleware/08_progressive_skills.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/examples/middleware/override_examples.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/agent/get_agent.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/native_smart_retry_runnable.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/smart_retry_runnable.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.0b25 → sycommon_python_lib-0.2.0b26}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sycommon-python-lib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.0b26
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -9,27 +9,27 @@ Requires-Dist: aiohttp>=3.13.3
|
|
|
9
9
|
Requires-Dist: aiomysql>=0.3.2
|
|
10
10
|
Requires-Dist: anyio>=4.12.1
|
|
11
11
|
Requires-Dist: decorator>=5.2.1
|
|
12
|
-
Requires-Dist: deepagents>=0.4.
|
|
12
|
+
Requires-Dist: deepagents>=0.4.11
|
|
13
13
|
Requires-Dist: elasticsearch>=9.3.0
|
|
14
|
-
Requires-Dist: fastapi>=0.
|
|
14
|
+
Requires-Dist: fastapi>=0.135.1
|
|
15
15
|
Requires-Dist: jinja2>=3.1.6
|
|
16
16
|
Requires-Dist: kafka-python>=2.3.0
|
|
17
|
-
Requires-Dist: langchain>=1.2.
|
|
18
|
-
Requires-Dist: langchain-core>=1.2.
|
|
19
|
-
Requires-Dist: langchain-openai>=1.1.
|
|
20
|
-
Requires-Dist: langfuse>=
|
|
21
|
-
Requires-Dist: langgraph>=1.
|
|
17
|
+
Requires-Dist: langchain>=1.2.12
|
|
18
|
+
Requires-Dist: langchain-core>=1.2.19
|
|
19
|
+
Requires-Dist: langchain-openai>=1.1.11
|
|
20
|
+
Requires-Dist: langfuse>=4.0.0
|
|
21
|
+
Requires-Dist: langgraph>=1.1.2
|
|
22
22
|
Requires-Dist: loguru>=0.7.3
|
|
23
23
|
Requires-Dist: mysql-connector-python>=9.6.0
|
|
24
24
|
Requires-Dist: nacos-sdk-python<3.0,>=2.0.9
|
|
25
25
|
Requires-Dist: psutil>=7.2.2
|
|
26
26
|
Requires-Dist: pydantic>=2.12.5
|
|
27
|
-
Requires-Dist: python-dotenv>=1.2.
|
|
27
|
+
Requires-Dist: python-dotenv>=1.2.2
|
|
28
28
|
Requires-Dist: python-multipart>=0.0.22
|
|
29
29
|
Requires-Dist: pyyaml>=6.0.3
|
|
30
30
|
Requires-Dist: redis>=7.3.0
|
|
31
|
-
Requires-Dist: sentry-sdk[fastapi]>=2.
|
|
32
|
-
Requires-Dist: sqlalchemy[asyncio]>=2.0.
|
|
31
|
+
Requires-Dist: sentry-sdk[fastapi]>=2.54.0
|
|
32
|
+
Requires-Dist: sqlalchemy[asyncio]>=2.0.48
|
|
33
33
|
Requires-Dist: starlette>=0.52.1
|
|
34
34
|
Requires-Dist: tiktoken>=0.12.0
|
|
35
35
|
Requires-Dist: uvicorn>=0.41.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sycommon-python-lib"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.0b26"
|
|
4
4
|
description = "Add your description here"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -10,27 +10,27 @@ dependencies = [
|
|
|
10
10
|
"aiomysql>=0.3.2",
|
|
11
11
|
"anyio>=4.12.1",
|
|
12
12
|
"decorator>=5.2.1",
|
|
13
|
-
"deepagents>=0.4.
|
|
13
|
+
"deepagents>=0.4.11",
|
|
14
14
|
"elasticsearch>=9.3.0",
|
|
15
|
-
"fastapi>=0.
|
|
15
|
+
"fastapi>=0.135.1",
|
|
16
16
|
"jinja2>=3.1.6",
|
|
17
17
|
"kafka-python>=2.3.0",
|
|
18
|
-
"langchain>=1.2.
|
|
19
|
-
"langchain-core>=1.2.
|
|
20
|
-
"langchain-openai>=1.1.
|
|
21
|
-
"langfuse>=
|
|
22
|
-
"langgraph>=1.
|
|
18
|
+
"langchain>=1.2.12",
|
|
19
|
+
"langchain-core>=1.2.19",
|
|
20
|
+
"langchain-openai>=1.1.11",
|
|
21
|
+
"langfuse>=4.0.0",
|
|
22
|
+
"langgraph>=1.1.2",
|
|
23
23
|
"loguru>=0.7.3",
|
|
24
24
|
"mysql-connector-python>=9.6.0",
|
|
25
25
|
"nacos-sdk-python>=2.0.9,<3.0",
|
|
26
26
|
"psutil>=7.2.2",
|
|
27
27
|
"pydantic>=2.12.5",
|
|
28
|
-
"python-dotenv>=1.2.
|
|
28
|
+
"python-dotenv>=1.2.2",
|
|
29
29
|
"python-multipart>=0.0.22",
|
|
30
30
|
"pyyaml>=6.0.3",
|
|
31
31
|
"redis>=7.3.0",
|
|
32
|
-
"sentry-sdk[fastapi]>=2.
|
|
33
|
-
"sqlalchemy[asyncio]>=2.0.
|
|
32
|
+
"sentry-sdk[fastapi]>=2.54.0",
|
|
33
|
+
"sqlalchemy[asyncio]>=2.0.48",
|
|
34
34
|
"starlette>=0.52.1",
|
|
35
35
|
"tiktoken>=0.12.0",
|
|
36
36
|
"uvicorn>=0.41.0",
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""
|
|
2
|
+
sycommon.agent - DeepAgents 便捷封装
|
|
3
|
+
|
|
4
|
+
提供对 deepagents 的便捷调用,自动集成 get_llm 的 Token 统计和 Langfuse 追踪
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from sycommon.agent.exports import *
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
# 主要接口
|
|
11
|
+
"get_agent",
|
|
12
|
+
"create_tool_agent",
|
|
13
|
+
"create_multi_agent",
|
|
14
|
+
"create_structured_agent",
|
|
15
|
+
# deepagents 透传
|
|
16
|
+
"SubAgent",
|
|
17
|
+
"CompiledSubAgent",
|
|
18
|
+
"create_deep_agent",
|
|
19
|
+
"MemoryMiddleware",
|
|
20
|
+
"FilesystemMiddleware",
|
|
21
|
+
"SubAgentMiddleware",
|
|
22
|
+
# 虚拟员工系统
|
|
23
|
+
"VirtualEmployee",
|
|
24
|
+
"VirtualTeam",
|
|
25
|
+
"EmployeeFactory",
|
|
26
|
+
"Skill",
|
|
27
|
+
"SkillLevel",
|
|
28
|
+
"SubTeamMember",
|
|
29
|
+
"MemoryConfig",
|
|
30
|
+
"MemoryType",
|
|
31
|
+
"EmployeeMiddleware",
|
|
32
|
+
"LoggingEmployeeMiddleware",
|
|
33
|
+
"QuotaEmployeeMiddleware",
|
|
34
|
+
"PermissionEmployeeMiddleware",
|
|
35
|
+
# 技能系统中间件
|
|
36
|
+
"SkillsMiddleware",
|
|
37
|
+
"SkillMetadata",
|
|
38
|
+
]
|
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
"""
|
|
2
|
+
虚拟员工系统示例
|
|
3
|
+
================
|
|
4
|
+
|
|
5
|
+
展示如何使用 VirtualEmployee 封装创建业务级的虚拟员工。
|
|
6
|
+
|
|
7
|
+
运行方式:
|
|
8
|
+
python -m sycommon.agent.examples.virtual_employee_demo
|
|
9
|
+
"""
|
|
10
|
+
import asyncio
|
|
11
|
+
from typing import Optional
|
|
12
|
+
from pydantic import BaseModel, Field
|
|
13
|
+
from langchain_core.tools import tool
|
|
14
|
+
from langchain_core.messages import HumanMessage
|
|
15
|
+
|
|
16
|
+
from sycommon.agent import (
|
|
17
|
+
VirtualEmployee,
|
|
18
|
+
VirtualTeam,
|
|
19
|
+
EmployeeFactory,
|
|
20
|
+
Skill,
|
|
21
|
+
SkillLevel,
|
|
22
|
+
SubTeamMember,
|
|
23
|
+
MemoryConfig,
|
|
24
|
+
MemoryType,
|
|
25
|
+
LoggingEmployeeMiddleware,
|
|
26
|
+
QuotaEmployeeMiddleware,
|
|
27
|
+
PermissionEmployeeMiddleware,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# ========== 工具定义 ==========
|
|
32
|
+
|
|
33
|
+
@tool
|
|
34
|
+
def search_faq(keyword: str) -> str:
|
|
35
|
+
"""搜索常见问题"""
|
|
36
|
+
faqs = {
|
|
37
|
+
"退货": "退货政策:购买后7天内可无理由退货",
|
|
38
|
+
"退款": "退款将在3-5个工作日内到账",
|
|
39
|
+
"配送": "配送时间:一线城市1-2天,其他地区3-5天"
|
|
40
|
+
}
|
|
41
|
+
for key, value in faqs.items():
|
|
42
|
+
if key in keyword:
|
|
43
|
+
return f"找到FAQ: {value}"
|
|
44
|
+
return f"未找到与 '{keyword}' 相关的FAQ"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@tool
|
|
48
|
+
def create_ticket(title: str, content: str) -> str:
|
|
49
|
+
"""创建工单"""
|
|
50
|
+
return f"工单已创建: #{hash(title) % 10000} - {title}"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@tool
|
|
54
|
+
def search_web(query: str) -> str:
|
|
55
|
+
"""搜索网络"""
|
|
56
|
+
return f"搜索结果: {query} 相关信息..."
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@tool
|
|
60
|
+
def analyze_data(data: str) -> str:
|
|
61
|
+
"""分析数据"""
|
|
62
|
+
return f"分析结果: {data}"
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# ========== 示例函数 ==========
|
|
66
|
+
|
|
67
|
+
async def basic_employee():
|
|
68
|
+
"""基础虚拟员工"""
|
|
69
|
+
print("=" * 60)
|
|
70
|
+
print("示例 1: 基础虚拟员工")
|
|
71
|
+
print("=" * 60)
|
|
72
|
+
|
|
73
|
+
# 创建一个简单的客服员工
|
|
74
|
+
employee = VirtualEmployee(
|
|
75
|
+
name="客服小美",
|
|
76
|
+
role="客户支持专员",
|
|
77
|
+
model="Qwen2.5-72B",
|
|
78
|
+
skills=[
|
|
79
|
+
Skill("faq", "回答常见问题", level=SkillLevel.INTERMEDIATE),
|
|
80
|
+
Skill("complaint", "处理客户投诉", level=SkillLevel.SENIOR),
|
|
81
|
+
],
|
|
82
|
+
tools=[search_faq, create_ticket],
|
|
83
|
+
system_prompt="请用友好的语气回答客户问题。"
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
print(f"\n员工信息: {employee}")
|
|
87
|
+
|
|
88
|
+
# 执行任务
|
|
89
|
+
result = await employee.run("我想退货,怎么操作?")
|
|
90
|
+
print(f"\n用户: 我想退货,怎么操作?")
|
|
91
|
+
print(f"员工: {result}")
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
async def employee_with_subteam():
|
|
95
|
+
"""带内部小团队的员工"""
|
|
96
|
+
print("\n" + "=" * 60)
|
|
97
|
+
print("示例 2: 带内部小团队的经理员工")
|
|
98
|
+
print("=" * 60)
|
|
99
|
+
|
|
100
|
+
# 创建经理员工,带有内部小团队
|
|
101
|
+
manager = VirtualEmployee(
|
|
102
|
+
name="项目经理张三",
|
|
103
|
+
role="项目经理",
|
|
104
|
+
model="Qwen2.5-72B",
|
|
105
|
+
subteam=[
|
|
106
|
+
SubTeamMember(
|
|
107
|
+
name="研究员",
|
|
108
|
+
role="负责调研和分析",
|
|
109
|
+
system_prompt="你是研究员,负责收集和分析信息。"
|
|
110
|
+
),
|
|
111
|
+
SubTeamMember(
|
|
112
|
+
name="执行员",
|
|
113
|
+
role="负责具体执行",
|
|
114
|
+
system_prompt="你是执行员,负责落实具体任务。"
|
|
115
|
+
)
|
|
116
|
+
],
|
|
117
|
+
skills=[
|
|
118
|
+
Skill("coordination", "协调团队成员"),
|
|
119
|
+
Skill("planning", "制定工作计划")
|
|
120
|
+
],
|
|
121
|
+
system_prompt="你需要协调内部小团队完成工作。"
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
result = await manager.run("帮我规划一个新产品发布方案")
|
|
125
|
+
print(f"\n用户: 帮我规划一个新产品发布方案")
|
|
126
|
+
print(f"经理: {result[:200]}...")
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
async def employee_with_memory():
|
|
130
|
+
"""带记忆的员工"""
|
|
131
|
+
print("\n" + "=" * 60)
|
|
132
|
+
print("示例 3: 带记忆的员工")
|
|
133
|
+
print("=" * 60)
|
|
134
|
+
|
|
135
|
+
employee = VirtualEmployee(
|
|
136
|
+
name="助手小明",
|
|
137
|
+
role="智能助手",
|
|
138
|
+
model="Qwen2.5-72B",
|
|
139
|
+
memory=MemoryConfig(
|
|
140
|
+
types=[MemoryType.CONVERSATION, MemoryType.EPISODIC],
|
|
141
|
+
max_history=50
|
|
142
|
+
),
|
|
143
|
+
system_prompt="你需要记住用户的偏好和信息。"
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
thread_id = "user_001"
|
|
147
|
+
|
|
148
|
+
# 第一轮对话
|
|
149
|
+
print("\n--- 第一轮对话 ---")
|
|
150
|
+
result1 = await employee.run("我叫李华,我喜欢科技产品", thread_id=thread_id)
|
|
151
|
+
print(f"用户: 我叫李华,我喜欢科技产品")
|
|
152
|
+
print(f"员工: {result1}")
|
|
153
|
+
|
|
154
|
+
# 第二轮对话(有记忆)
|
|
155
|
+
print("\n--- 第二轮对话 ---")
|
|
156
|
+
result2 = await employee.run("你还记得我叫什么吗?我喜欢什么?", thread_id=thread_id)
|
|
157
|
+
print(f"用户: 你还记得我叫什么吗?我喜欢什么?")
|
|
158
|
+
print(f"员工: {result2}")
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
async def employee_with_middleware():
|
|
162
|
+
"""带中间件的员工"""
|
|
163
|
+
print("\n" + "=" * 60)
|
|
164
|
+
print("示例 4: 带中间件的员工")
|
|
165
|
+
print("=" * 60)
|
|
166
|
+
|
|
167
|
+
# 创建带日志和配额中间件的员工
|
|
168
|
+
logger = LoggingEmployeeMiddleware(verbose=True)
|
|
169
|
+
quota = QuotaEmployeeMiddleware(max_requests=5)
|
|
170
|
+
|
|
171
|
+
employee = VirtualEmployee(
|
|
172
|
+
name="受限助手",
|
|
173
|
+
role="有使用限制的助手",
|
|
174
|
+
model="Qwen2.5-72B",
|
|
175
|
+
middleware=[logger, quota]
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
# 执行几次任务
|
|
179
|
+
for i in range(2):
|
|
180
|
+
print(f"\n--- 请求 {i+1} ---")
|
|
181
|
+
result = await employee.run(f"问题{i+1}")
|
|
182
|
+
print(f"员工: {result[:100]}...")
|
|
183
|
+
|
|
184
|
+
print(f"\n剩余配额: {quota.remaining}")
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
async def employee_with_permission():
|
|
188
|
+
"""带权限控制的员工"""
|
|
189
|
+
print("\n" + "=" * 60)
|
|
190
|
+
print("示例 5: 带权限控制的员工")
|
|
191
|
+
print("=" * 60)
|
|
192
|
+
|
|
193
|
+
# 只允许读取操作
|
|
194
|
+
permission = PermissionEmployeeMiddleware(allowed_actions=["read"])
|
|
195
|
+
|
|
196
|
+
employee = VirtualEmployee(
|
|
197
|
+
name="只读助手",
|
|
198
|
+
role="只读权限的助手",
|
|
199
|
+
model="Qwen2.5-72B",
|
|
200
|
+
middleware=[permission]
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
# 读取操作(允许)
|
|
204
|
+
print("\n--- 读取操作 ---")
|
|
205
|
+
result = await employee.run("查看系统状态")
|
|
206
|
+
print(f"员工: {result[:100]}...")
|
|
207
|
+
|
|
208
|
+
# 删除操作(拒绝)
|
|
209
|
+
print("\n--- 删除操作 ---")
|
|
210
|
+
try:
|
|
211
|
+
await employee.run("删除所有数据")
|
|
212
|
+
except PermissionError as e:
|
|
213
|
+
print(f"权限错误: {e}")
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
async def factory_employees():
|
|
217
|
+
"""使用工厂创建员工"""
|
|
218
|
+
print("\n" + "=" * 60)
|
|
219
|
+
print("示例 6: 使用工厂创建员工")
|
|
220
|
+
print("=" * 60)
|
|
221
|
+
|
|
222
|
+
# 创建客服员工
|
|
223
|
+
support = EmployeeFactory.create_support_agent(
|
|
224
|
+
name="客服小红",
|
|
225
|
+
tools=[search_faq, create_ticket]
|
|
226
|
+
)
|
|
227
|
+
print(f"\n客服员工: {support}")
|
|
228
|
+
|
|
229
|
+
# 创建研究员工
|
|
230
|
+
researcher = EmployeeFactory.create_researcher(
|
|
231
|
+
name="研究员小张",
|
|
232
|
+
tools=[search_web, analyze_data]
|
|
233
|
+
)
|
|
234
|
+
print(f"研究员工: {researcher}")
|
|
235
|
+
|
|
236
|
+
# 创建写作员工
|
|
237
|
+
writer = EmployeeFactory.create_writer(name="写作专家小李")
|
|
238
|
+
print(f"写作员工: {writer}")
|
|
239
|
+
|
|
240
|
+
# 创建经理员工
|
|
241
|
+
manager = EmployeeFactory.create_manager(name="经理小王")
|
|
242
|
+
print(f"经理员工: {manager}")
|
|
243
|
+
|
|
244
|
+
# 测试研究员工
|
|
245
|
+
print("\n--- 研究员工工作 ---")
|
|
246
|
+
result = await researcher.run("研究一下人工智能的最新发展")
|
|
247
|
+
print(f"研究员: {result[:200]}...")
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
async def chain_configuration():
|
|
251
|
+
"""链式配置员工"""
|
|
252
|
+
print("\n" + "=" * 60)
|
|
253
|
+
print("示例 7: 链式配置员工")
|
|
254
|
+
print("=" * 60)
|
|
255
|
+
|
|
256
|
+
# 使用链式调用配置员工
|
|
257
|
+
employee = (
|
|
258
|
+
VirtualEmployee(
|
|
259
|
+
name="可配置助手",
|
|
260
|
+
role="灵活配置的助手",
|
|
261
|
+
model="Qwen2.5-72B"
|
|
262
|
+
)
|
|
263
|
+
.add_skill(Skill("chat", "日常对话"))
|
|
264
|
+
.add_skill(Skill("translate", "翻译服务"))
|
|
265
|
+
.add_tool(search_web)
|
|
266
|
+
.use_middleware(LoggingEmployeeMiddleware(verbose=True))
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
print(f"员工: {employee}")
|
|
270
|
+
print(f"技能数: {len(employee.skills)}")
|
|
271
|
+
print(f"工具数: {len(employee.tools)}")
|
|
272
|
+
|
|
273
|
+
result = await employee.run("你好")
|
|
274
|
+
print(f"\n员工: {result[:100]}...")
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
async def virtual_team():
|
|
278
|
+
"""虚拟团队"""
|
|
279
|
+
print("\n" + "=" * 60)
|
|
280
|
+
print("示例 8: 虚拟团队")
|
|
281
|
+
print("=" * 60)
|
|
282
|
+
|
|
283
|
+
# 创建多个员工
|
|
284
|
+
support = EmployeeFactory.create_support_agent(name="客服小美")
|
|
285
|
+
researcher = EmployeeFactory.create_researcher(name="研究员小张")
|
|
286
|
+
writer = EmployeeFactory.create_writer(name="写作专家小李")
|
|
287
|
+
|
|
288
|
+
# 组建团队
|
|
289
|
+
team = VirtualTeam(
|
|
290
|
+
name="智能服务团队",
|
|
291
|
+
employees=[support, researcher, writer],
|
|
292
|
+
coordinator=EmployeeFactory.create_manager(name="团队经理")
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
print(f"团队: {team}")
|
|
296
|
+
|
|
297
|
+
# 委派任务给特定员工
|
|
298
|
+
print("\n--- 委派任务给客服 ---")
|
|
299
|
+
result = await team.delegate("客服小美", "我想咨询退货问题")
|
|
300
|
+
print(f"客服小美: {result[:150]}...")
|
|
301
|
+
|
|
302
|
+
print("\n--- 委派任务给研究员 ---")
|
|
303
|
+
result = await team.delegate("研究员小张", "研究市场趋势")
|
|
304
|
+
print(f"研究员小张: {result[:150]}...")
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
async def combined_example():
|
|
308
|
+
"""综合示例"""
|
|
309
|
+
print("\n" + "=" * 60)
|
|
310
|
+
print("示例 9: 综合示例 - 完整的客服系统")
|
|
311
|
+
print("=" * 60)
|
|
312
|
+
|
|
313
|
+
# 创建带完整功能的客服员工
|
|
314
|
+
logger = LoggingEmployeeMiddleware(verbose=True)
|
|
315
|
+
quota = QuotaEmployeeMiddleware(max_requests=100)
|
|
316
|
+
|
|
317
|
+
support = VirtualEmployee(
|
|
318
|
+
name="高级客服专家",
|
|
319
|
+
role="高级客户支持专员",
|
|
320
|
+
model="Qwen2.5-72B",
|
|
321
|
+
skills=[
|
|
322
|
+
Skill("faq", "回答常见问题", level=SkillLevel.SENIOR,
|
|
323
|
+
examples=["退货政策", "配送时间"]),
|
|
324
|
+
Skill("complaint", "处理客户投诉", level=SkillLevel.EXPERT,
|
|
325
|
+
examples=["产品质量", "服务态度"]),
|
|
326
|
+
Skill("escalation", "问题升级处理", level=SkillLevel.EXPERT),
|
|
327
|
+
],
|
|
328
|
+
tools=[search_faq, create_ticket],
|
|
329
|
+
subteam=[
|
|
330
|
+
SubTeamMember(name="技术支持", role="处理技术问题"),
|
|
331
|
+
SubTeamMember(name="售后专员", role="处理售后问题")
|
|
332
|
+
],
|
|
333
|
+
memory=MemoryConfig(
|
|
334
|
+
types=[MemoryType.CONVERSATION],
|
|
335
|
+
max_history=100
|
|
336
|
+
),
|
|
337
|
+
middleware=[logger, quota],
|
|
338
|
+
system_prompt="""你是一个专业、友好的高级客服专家。
|
|
339
|
+
你可以:
|
|
340
|
+
1. 直接回答常见问题
|
|
341
|
+
2. 处理客户投诉
|
|
342
|
+
3. 委派给技术支持或售后专员
|
|
343
|
+
4. 创建工单跟踪问题
|
|
344
|
+
"""
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
# 模拟客户服务场景
|
|
348
|
+
thread_id = "customer_001"
|
|
349
|
+
|
|
350
|
+
print("\n--- 场景1: 咨询退货 ---")
|
|
351
|
+
result = await support.run("我买的东西不喜欢,可以退货吗?", thread_id=thread_id)
|
|
352
|
+
print(f"客户: 我买的东西不喜欢,可以退货吗?")
|
|
353
|
+
print(f"客服: {result}")
|
|
354
|
+
|
|
355
|
+
print("\n--- 场景2: 追问细节 ---")
|
|
356
|
+
result = await support.run("退货需要什么条件?", thread_id=thread_id)
|
|
357
|
+
print(f"客户: 退货需要什么条件?")
|
|
358
|
+
print(f"客服: {result}")
|
|
359
|
+
|
|
360
|
+
print(f"\n剩余配额: {quota.remaining}")
|
|
361
|
+
print(f"日志条数: {len(logger.logs)}")
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
async def structured_output_example():
|
|
365
|
+
"""结构化输出示例"""
|
|
366
|
+
print("\n" + "=" * 60)
|
|
367
|
+
print("示例 10: 结构化输出")
|
|
368
|
+
print("=" * 60)
|
|
369
|
+
|
|
370
|
+
# 定义输出格式
|
|
371
|
+
class AnalysisResult(BaseModel):
|
|
372
|
+
"""分析结果结构"""
|
|
373
|
+
summary: str = Field(description="简要总结")
|
|
374
|
+
sentiment: str = Field(description="情感倾向: positive/negative/neutral")
|
|
375
|
+
confidence: float = Field(description="置信度 0-1")
|
|
376
|
+
keywords: list = Field(description="关键词列表")
|
|
377
|
+
|
|
378
|
+
# 创建结构化输出员工
|
|
379
|
+
analyst = VirtualEmployee(
|
|
380
|
+
name="情感分析师",
|
|
381
|
+
role="文本情感分析专家",
|
|
382
|
+
model="Qwen2.5-72B",
|
|
383
|
+
response_format=AnalysisResult,
|
|
384
|
+
system_prompt="你是情感分析专家,分析文本的情感和关键信息。"
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
print(f"\n员工: {analyst}")
|
|
388
|
+
print(f"输出格式: {AnalysisResult.__name__}")
|
|
389
|
+
|
|
390
|
+
result = await analyst.run("这个产品太棒了!质量好,价格合理,非常满意!")
|
|
391
|
+
print(f"\n用户: 这个产品太棒了!质量好,价格合理,非常满意!")
|
|
392
|
+
print(f"分析结果: {result}")
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
async def interrupt_example():
|
|
396
|
+
"""中断控制示例(人工审核)"""
|
|
397
|
+
print("\n" + "=" * 60)
|
|
398
|
+
print("示例 11: 中断控制 - 人工审核")
|
|
399
|
+
print("=" * 60)
|
|
400
|
+
|
|
401
|
+
# 创建带中断控制的员工
|
|
402
|
+
from langgraph.checkpoint.memory import MemorySaver
|
|
403
|
+
|
|
404
|
+
approver = VirtualEmployee(
|
|
405
|
+
name="审批助手",
|
|
406
|
+
role="审批流程助手",
|
|
407
|
+
model="Qwen2.5-72B",
|
|
408
|
+
tools=[create_ticket],
|
|
409
|
+
checkpointer=MemorySaver(),
|
|
410
|
+
interrupt_on={"tool_calls": True}, # 工具调用前中断
|
|
411
|
+
system_prompt="你是审批助手,在执行重要操作前需要人工确认。"
|
|
412
|
+
)
|
|
413
|
+
|
|
414
|
+
thread_id = "approval_001"
|
|
415
|
+
config = {"configurable": {"thread_id": thread_id}}
|
|
416
|
+
|
|
417
|
+
print(f"\n员工: {approver}")
|
|
418
|
+
print("场景: 创建工单需要人工确认")
|
|
419
|
+
|
|
420
|
+
# 发起请求
|
|
421
|
+
print("\n--- 发起请求 ---")
|
|
422
|
+
result = await approver.run("帮我创建一个紧急工单,标题是系统故障", thread_id=thread_id)
|
|
423
|
+
print(f"用户: 帮我创建一个紧急工单,标题是系统故障")
|
|
424
|
+
print(f"当前状态: {result[:100]}...")
|
|
425
|
+
|
|
426
|
+
# 检查状态
|
|
427
|
+
print("\n--- 检查状态 ---")
|
|
428
|
+
state = await approver.aget_state(config)
|
|
429
|
+
print(f"是否需要继续: {bool(state.next)}")
|
|
430
|
+
print(f"下一步: {state.next}")
|
|
431
|
+
|
|
432
|
+
# 模拟人工确认后继续
|
|
433
|
+
if state.next:
|
|
434
|
+
print("\n--- 人工确认后继续 ---")
|
|
435
|
+
result = await approver.ainvoke(None, config=config)
|
|
436
|
+
print(f"最终结果: {result['messages'][-1].content[:100]}...")
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
async def main():
|
|
440
|
+
"""运行所有示例"""
|
|
441
|
+
print("\n" + "=" * 70)
|
|
442
|
+
print("🚀 虚拟员工系统示例")
|
|
443
|
+
print("=" * 70)
|
|
444
|
+
|
|
445
|
+
await basic_employee()
|
|
446
|
+
await employee_with_subteam()
|
|
447
|
+
await employee_with_memory()
|
|
448
|
+
await employee_with_middleware()
|
|
449
|
+
await employee_with_permission()
|
|
450
|
+
await factory_employees()
|
|
451
|
+
await chain_configuration()
|
|
452
|
+
await virtual_team()
|
|
453
|
+
await combined_example()
|
|
454
|
+
await structured_output_example()
|
|
455
|
+
await interrupt_example()
|
|
456
|
+
|
|
457
|
+
print("\n" + "=" * 70)
|
|
458
|
+
print("✅ 所有示例完成")
|
|
459
|
+
print("=" * 70)
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
if __name__ == "__main__":
|
|
463
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""
|
|
2
|
+
sycommon.agent 导出
|
|
3
|
+
=====================
|
|
4
|
+
|
|
5
|
+
提供对 deepagents 的便捷调用,自动集成 get_llm 的 Token 统计和 Langfuse 追踪。
|
|
6
|
+
|
|
7
|
+
## 使用示例
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
from sycommon.agent import get_agent, SubAgent
|
|
11
|
+
|
|
12
|
+
# 创建 Agent
|
|
13
|
+
agent = get_agent(
|
|
14
|
+
model="Qwen2.5-72B",
|
|
15
|
+
tools=[my_tool],
|
|
16
|
+
system_prompt="你是助手"
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
# 执行
|
|
20
|
+
result = await agent.ainvoke({"messages": ["你好"]})
|
|
21
|
+
|
|
22
|
+
# 多 Agent
|
|
23
|
+
agent = get_agent(
|
|
24
|
+
model="Qwen2.5-72B",
|
|
25
|
+
subagents=[
|
|
26
|
+
SubAgent(name="researcher", description="研究助手"),
|
|
27
|
+
]
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
# 虚拟员工(业务层封装)
|
|
31
|
+
from sycommon.agent import VirtualEmployee, Skill, EmployeeFactory
|
|
32
|
+
|
|
33
|
+
support = EmployeeFactory.create_support_agent(name="客服小美")
|
|
34
|
+
result = await support.run("我需要帮助")
|
|
35
|
+
```
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
# 主要接口
|
|
39
|
+
from sycommon.agent.get_agent import (
|
|
40
|
+
get_agent,
|
|
41
|
+
create_tool_agent,
|
|
42
|
+
create_multi_agent,
|
|
43
|
+
create_structured_agent,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
# 透传 deepagents 的核心类,方便用户直接使用
|
|
47
|
+
from deepagents import (
|
|
48
|
+
SubAgent,
|
|
49
|
+
CompiledSubAgent,
|
|
50
|
+
create_deep_agent,
|
|
51
|
+
MemoryMiddleware,
|
|
52
|
+
FilesystemMiddleware,
|
|
53
|
+
SubAgentMiddleware,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# 虚拟员工系统(业务层封装)
|
|
57
|
+
from sycommon.agent.virtual_employee import (
|
|
58
|
+
VirtualEmployee,
|
|
59
|
+
VirtualTeam,
|
|
60
|
+
EmployeeFactory,
|
|
61
|
+
Skill,
|
|
62
|
+
SkillLevel,
|
|
63
|
+
SubTeamMember,
|
|
64
|
+
MemoryConfig,
|
|
65
|
+
MemoryType,
|
|
66
|
+
EmployeeMiddleware,
|
|
67
|
+
LoggingEmployeeMiddleware,
|
|
68
|
+
QuotaEmployeeMiddleware,
|
|
69
|
+
PermissionEmployeeMiddleware,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# 技能系统中间件(从 deepagents 导入)
|
|
73
|
+
from sycommon.agent.skills import (
|
|
74
|
+
SkillsMiddleware,
|
|
75
|
+
SkillMetadata,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
__all__ = [
|
|
79
|
+
# 主要接口
|
|
80
|
+
"get_agent",
|
|
81
|
+
"create_tool_agent",
|
|
82
|
+
"create_multi_agent",
|
|
83
|
+
"create_structured_agent",
|
|
84
|
+
# deepagents 透传
|
|
85
|
+
"SubAgent",
|
|
86
|
+
"CompiledSubAgent",
|
|
87
|
+
"create_deep_agent",
|
|
88
|
+
"MemoryMiddleware",
|
|
89
|
+
"FilesystemMiddleware",
|
|
90
|
+
"SubAgentMiddleware",
|
|
91
|
+
# 虚拟员工系统
|
|
92
|
+
"VirtualEmployee",
|
|
93
|
+
"VirtualTeam",
|
|
94
|
+
"EmployeeFactory",
|
|
95
|
+
"Skill",
|
|
96
|
+
"SkillLevel",
|
|
97
|
+
"SubTeamMember",
|
|
98
|
+
"MemoryConfig",
|
|
99
|
+
"MemoryType",
|
|
100
|
+
"EmployeeMiddleware",
|
|
101
|
+
"LoggingEmployeeMiddleware",
|
|
102
|
+
"QuotaEmployeeMiddleware",
|
|
103
|
+
"PermissionEmployeeMiddleware",
|
|
104
|
+
# 技能系统中间件
|
|
105
|
+
"SkillsMiddleware",
|
|
106
|
+
"SkillMetadata",
|
|
107
|
+
]
|