sunholo 0.144.8__tar.gz → 0.144.9__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.
- {sunholo-0.144.8/src/sunholo.egg-info → sunholo-0.144.9}/PKG-INFO +1 -1
- {sunholo-0.144.8 → sunholo-0.144.9}/pyproject.toml +1 -1
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/fastapi/vac_routes.py +10 -17
- {sunholo-0.144.8 → sunholo-0.144.9/src/sunholo.egg-info}/PKG-INFO +1 -1
- {sunholo-0.144.8 → sunholo-0.144.9}/tests/test_vac_routes_mcp.py +58 -3
- {sunholo-0.144.8 → sunholo-0.144.9}/LICENSE.txt +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/MANIFEST.in +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/README.md +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/setup.cfg +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/a2a/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/a2a/agent_card.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/a2a/task_manager.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/a2a/vac_a2a_agent.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/chat_history.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/dispatch_to_qa.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/fastapi/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/fastapi/base.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/fastapi/qna_routes.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/flask/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/flask/base.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/flask/vac_routes.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/langserve.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/pubsub.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/route.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/special_commands.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/agents/swagger.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/archive/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/archive/archive.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/auth/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/auth/gcloud.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/auth/refresh.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/auth/run.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/azure/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/azure/auth.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/azure/blobs.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/azure/event_grid.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/bots/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/bots/discord.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/bots/github_webhook.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/bots/webapp.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/chunker/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/chunker/azure.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/chunker/doc_handling.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/chunker/encode_metadata.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/chunker/images.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/chunker/loaders.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/chunker/message_data.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/chunker/pdfs.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/chunker/process_chunker_data.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/chunker/publish.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/chunker/pubsub.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/chunker/splitter.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/cli/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/cli/chat_vac.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/cli/cli.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/cli/cli_init.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/cli/configs.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/cli/deploy.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/cli/embedder.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/cli/merge_texts.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/cli/run_proxy.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/cli/sun_rich.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/cli/swagger.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/cli/vertex.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/components/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/components/llm.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/components/retriever.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/components/vectorstore.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/custom_logging.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/alloydb.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/alloydb_client.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/database.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/lancedb.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/sql/sb/create_function.sql +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/sql/sb/create_function_time.sql +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/sql/sb/create_table.sql +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/sql/sb/delete_source_row.sql +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/sql/sb/return_sources.sql +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/sql/sb/setup.sql +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/static_dbs.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/database/uuid.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/discovery_engine/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/discovery_engine/chunker_handler.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/discovery_engine/cli.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/discovery_engine/create_new.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/discovery_engine/discovery_engine_client.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/discovery_engine/get_ai_search_chunks.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/embedder/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/embedder/embed_chunk.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/embedder/embed_metadata.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/excel/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/excel/plugin.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/gcs/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/gcs/add_file.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/gcs/download_folder.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/gcs/download_gcs_text.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/gcs/download_url.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/gcs/extract_and_sign.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/gcs/metadata.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/genai/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/genai/file_handling.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/genai/genaiv2.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/genai/images.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/genai/init.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/genai/process_funcs_cls.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/genai/safety.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/invoke/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/invoke/async_class.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/invoke/direct_vac_func.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/invoke/invoke_vac_utils.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/langchain_types.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/langfuse/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/langfuse/callback.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/langfuse/evals.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/langfuse/prompts.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/llamaindex/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/llamaindex/get_files.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/llamaindex/import_files.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/llamaindex/llamaindex_class.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/llamaindex/user_history.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/lookup/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/lookup/model_lookup.yaml +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/mcp/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/mcp/cli.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/mcp/cli_fastmcp.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/mcp/extensible_mcp_server.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/mcp/mcp_manager.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/mcp/sse_utils.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/mcp/stdio_http_bridge.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/mcp/vac_mcp_server.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/mcp/vac_mcp_server_fastmcp.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/mcp/vac_tools.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/ollama/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/ollama/ollama_images.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/pubsub/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/pubsub/process_pubsub.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/pubsub/pubsub_manager.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/qna/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/qna/parsers.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/qna/retry.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/senses/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/senses/stream_voice.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/streaming/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/streaming/content_buffer.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/streaming/langserve.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/streaming/stream_lookup.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/streaming/streaming.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/summarise/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/summarise/summarise.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/agent/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/agent/agent_service.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/agent/app.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/agent/my_log.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/agent/tools/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/agent/tools/your_agent.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/agent/vac_service.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/project/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/project/app.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/project/my_log.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/project/vac_service.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/system_services/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/system_services/app.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/templates/system_services/my_log.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/terraform/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/terraform/tfvars_editor.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/tools/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/tools/web_browser.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/api_key.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/big_context.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/config.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/config_class.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/config_schema.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/gcp.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/gcp_project.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/mime.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/parsers.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/proto_convert.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/timedelta.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/user_ids.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/utils/version.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/vertex/__init__.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/vertex/extensions_call.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/vertex/extensions_class.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/vertex/genai_functions.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/vertex/init.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/vertex/memory_tools.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/vertex/safety.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo/vertex/type_dict_to_json.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo.egg-info/SOURCES.txt +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo.egg-info/dependency_links.txt +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo.egg-info/entry_points.txt +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo.egg-info/requires.txt +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/src/sunholo.egg-info/top_level.txt +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/tests/test_async.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/tests/test_async_genai2.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/tests/test_chat_history.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/tests/test_config.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/tests/test_genai2.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/tests/test_unstructured.py +0 -0
- {sunholo-0.144.8 → sunholo-0.144.9}/tests/test_vac_routes_fastapi.py +0 -0
@@ -353,7 +353,6 @@ class VACRoutesFastAPI:
|
|
353
353
|
additional_routes: Optional[List[Dict]] = None,
|
354
354
|
mcp_servers: Optional[List[Dict[str, Any]]] = None,
|
355
355
|
add_langfuse_eval: bool = True,
|
356
|
-
enable_mcp_server: bool = False,
|
357
356
|
enable_a2a_agent: bool = False,
|
358
357
|
a2a_vac_names: Optional[List[str]] = None
|
359
358
|
):
|
@@ -371,9 +370,6 @@ class VACRoutesFastAPI:
|
|
371
370
|
mcp_servers: List of external MCP server configurations to connect to:
|
372
371
|
[{"name": "server-name", "command": "python", "args": ["server.py"]}]
|
373
372
|
add_langfuse_eval: Whether to enable Langfuse evaluation and tracing
|
374
|
-
enable_mcp_server: Whether to enable the MCP server at /mcp endpoint for
|
375
|
-
Claude Desktop/Code integration. When True, automatically
|
376
|
-
includes built-in VAC tools and supports custom tool registration.
|
377
373
|
enable_a2a_agent: Whether to enable A2A (Agent-to-Agent) protocol endpoints
|
378
374
|
a2a_vac_names: List of VAC names available for A2A agent interactions
|
379
375
|
|
@@ -398,7 +394,7 @@ class VACRoutesFastAPI:
|
|
398
394
|
|
399
395
|
## MCP Server Integration
|
400
396
|
|
401
|
-
When
|
397
|
+
When VACMCPServer is available, the following happens automatically:
|
402
398
|
1. MCP server is mounted at /mcp endpoint
|
403
399
|
2. Built-in VAC tools are automatically registered:
|
404
400
|
- vac_stream, vac_query, list_available_vacs, get_vac_info
|
@@ -452,13 +448,13 @@ class VACRoutesFastAPI:
|
|
452
448
|
self.mcp_client_manager = MCPClientManager() if MCPClientManager else None
|
453
449
|
self._mcp_initialized = False
|
454
450
|
|
455
|
-
# MCP server initialization
|
456
|
-
self.enable_mcp_server = enable_mcp_server
|
451
|
+
# MCP server initialization - automatically enabled if VACMCPServer is available
|
457
452
|
self.vac_mcp_server = None
|
458
453
|
self._custom_mcp_tools = []
|
459
454
|
self._custom_mcp_resources = []
|
460
455
|
|
461
|
-
if
|
456
|
+
# Enable MCP server if VACMCPServer is available
|
457
|
+
if VACMCPServer:
|
462
458
|
self.vac_mcp_server = VACMCPServer(
|
463
459
|
server_name="sunholo-vac-fastapi-server",
|
464
460
|
include_vac_tools=True
|
@@ -497,7 +493,7 @@ class VACRoutesFastAPI:
|
|
497
493
|
stream_interpreter: Streaming interpreter function
|
498
494
|
vac_interpreter: Non-streaming interpreter function
|
499
495
|
app_lifespan: Optional app lifespan context manager
|
500
|
-
**kwargs: Additional arguments passed to VACRoutesFastAPI
|
496
|
+
**kwargs: Additional arguments passed to VACRoutesFastAPI
|
501
497
|
|
502
498
|
Returns:
|
503
499
|
Tuple of (FastAPI app, VACRoutesFastAPI instance)
|
@@ -569,7 +565,6 @@ class VACRoutesFastAPI:
|
|
569
565
|
app,
|
570
566
|
stream_interpreter=stream_interpreter,
|
571
567
|
vac_interpreter=vac_interpreter,
|
572
|
-
enable_mcp_server=False, # Don't enable again since we manually mounted
|
573
568
|
**kwargs
|
574
569
|
)
|
575
570
|
|
@@ -589,7 +584,6 @@ class VACRoutesFastAPI:
|
|
589
584
|
app,
|
590
585
|
stream_interpreter=stream_interpreter,
|
591
586
|
vac_interpreter=vac_interpreter,
|
592
|
-
enable_mcp_server=False,
|
593
587
|
**kwargs
|
594
588
|
)
|
595
589
|
|
@@ -694,7 +688,7 @@ class VACRoutesFastAPI:
|
|
694
688
|
self.app.post("/mcp/resources/read")(self.handle_mcp_read_resource)
|
695
689
|
|
696
690
|
# MCP server endpoint - mount the FastMCP app
|
697
|
-
if self.
|
691
|
+
if self.vac_mcp_server:
|
698
692
|
try:
|
699
693
|
mcp_app = self.vac_mcp_server.get_http_app()
|
700
694
|
|
@@ -713,8 +707,7 @@ class VACRoutesFastAPI:
|
|
713
707
|
"The FastAPI app must be created with the MCP lifespan.\n\n"
|
714
708
|
"Quick fix: Use the helper method:\n"
|
715
709
|
" app, vac_routes = VACRoutesFastAPI.create_app_with_mcp(\n"
|
716
|
-
" stream_interpreter=your_interpreter
|
717
|
-
" enable_mcp_server=True\n"
|
710
|
+
" stream_interpreter=your_interpreter\n"
|
718
711
|
" )\n\n"
|
719
712
|
"Or manually configure the lifespan - see documentation for details."
|
720
713
|
)
|
@@ -727,8 +720,8 @@ class VACRoutesFastAPI:
|
|
727
720
|
log.error(f"Failed to mount MCP server: {e}")
|
728
721
|
raise RuntimeError(f"MCP server initialization failed: {e}") from e
|
729
722
|
|
730
|
-
# MCP debug endpoint - add
|
731
|
-
if self.
|
723
|
+
# MCP debug endpoint - add if we have a MCP server instance
|
724
|
+
if self.vac_mcp_server:
|
732
725
|
self.app.get("/debug/mcp")(self.handle_mcp_debug)
|
733
726
|
|
734
727
|
# A2A agent endpoints
|
@@ -1620,7 +1613,7 @@ class VACRoutesFastAPI:
|
|
1620
1613
|
pending_tools = len(self._custom_mcp_tools) if hasattr(self, '_custom_mcp_tools') else 0
|
1621
1614
|
|
1622
1615
|
return {
|
1623
|
-
"mcp_enabled":
|
1616
|
+
"mcp_enabled": has_mcp,
|
1624
1617
|
"has_mcp_server": has_mcp,
|
1625
1618
|
"mcp_tools_count": len(mcp_tools),
|
1626
1619
|
"mcp_tools": [tool["name"] for tool in mcp_tools] if mcp_tools else [],
|
@@ -214,7 +214,6 @@ def mcp_server_app():
|
|
214
214
|
app,
|
215
215
|
stream_interpreter=mock_async_stream_interpreter,
|
216
216
|
vac_interpreter=mock_async_vac_interpreter,
|
217
|
-
enable_mcp_server=False, # Disable initially
|
218
217
|
add_langfuse_eval=False
|
219
218
|
)
|
220
219
|
|
@@ -253,7 +252,6 @@ def mcp_client_app():
|
|
253
252
|
stream_interpreter=mock_async_stream_interpreter,
|
254
253
|
vac_interpreter=mock_async_vac_interpreter,
|
255
254
|
mcp_servers=mcp_servers,
|
256
|
-
enable_mcp_server=False,
|
257
255
|
add_langfuse_eval=False
|
258
256
|
)
|
259
257
|
# Replace with mock MCP client manager
|
@@ -320,7 +318,6 @@ class TestMCPServer:
|
|
320
318
|
vac_routes = VACRoutesFastAPI(
|
321
319
|
app,
|
322
320
|
stream_interpreter=mock_async_stream_interpreter,
|
323
|
-
enable_mcp_server=False,
|
324
321
|
add_langfuse_eval=False
|
325
322
|
)
|
326
323
|
client = TestClient(app)
|
@@ -331,6 +328,64 @@ class TestMCPServer:
|
|
331
328
|
|
332
329
|
|
333
330
|
|
331
|
+
class TestMCPDebugEndpoint:
|
332
|
+
"""Test MCP debug endpoint functionality."""
|
333
|
+
|
334
|
+
def test_debug_endpoint_with_mcp_server(self):
|
335
|
+
"""Test /debug/mcp endpoint when MCP server is enabled."""
|
336
|
+
app, vac_routes = VACRoutesFastAPI.create_app_with_mcp(
|
337
|
+
title="Test App",
|
338
|
+
stream_interpreter=mock_async_stream_interpreter
|
339
|
+
)
|
340
|
+
|
341
|
+
# Add a mock tool to test
|
342
|
+
@vac_routes.add_mcp_tool
|
343
|
+
async def test_tool(input: str) -> str:
|
344
|
+
"""Test tool for MCP."""
|
345
|
+
return f"Test: {input}"
|
346
|
+
|
347
|
+
client = TestClient(app)
|
348
|
+
response = client.get("/debug/mcp")
|
349
|
+
|
350
|
+
assert response.status_code == 200
|
351
|
+
data = response.json()
|
352
|
+
|
353
|
+
# Check basic structure
|
354
|
+
assert "mcp_enabled" in data
|
355
|
+
assert "has_mcp_server" in data
|
356
|
+
assert "mcp_tools_count" in data
|
357
|
+
assert "mcp_tools" in data
|
358
|
+
|
359
|
+
# Check values
|
360
|
+
assert data["mcp_enabled"] is True
|
361
|
+
assert data["has_mcp_server"] is True
|
362
|
+
assert data["mcp_tools_count"] >= 5 # Built-in tools + test_tool
|
363
|
+
|
364
|
+
# Check that test_tool is in the list
|
365
|
+
tool_names = [tool["name"] for tool in data["mcp_tools"]]
|
366
|
+
assert "test_tool" in tool_names
|
367
|
+
|
368
|
+
# Check built-in tools are present
|
369
|
+
assert "vac_stream" in tool_names
|
370
|
+
assert "vac_query" in tool_names
|
371
|
+
assert "list_available_vacs" in tool_names
|
372
|
+
assert "get_vac_info" in tool_names
|
373
|
+
|
374
|
+
def test_debug_endpoint_without_mcp_server(self):
|
375
|
+
"""Test /debug/mcp endpoint when MCP server is not present."""
|
376
|
+
app = FastAPI()
|
377
|
+
vac_routes = VACRoutesFastAPI(
|
378
|
+
app,
|
379
|
+
stream_interpreter=mock_async_stream_interpreter,
|
380
|
+
add_langfuse_eval=False
|
381
|
+
)
|
382
|
+
|
383
|
+
# Should not have debug endpoint if no MCP server
|
384
|
+
client = TestClient(app)
|
385
|
+
response = client.get("/debug/mcp")
|
386
|
+
assert response.status_code == 404
|
387
|
+
|
388
|
+
|
334
389
|
class TestMCPErrorHandling:
|
335
390
|
"""Test MCP error handling."""
|
336
391
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|