flowllm 0.1.0__py3-none-any.whl → 0.1.1__py3-none-any.whl
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.
- flowllm/__init__.py +12 -0
- flowllm/app.py +25 -0
- flowllm/config/default_config.yaml +82 -0
- flowllm/config/pydantic_config_parser.py +242 -0
- flowllm/context/base_context.py +59 -0
- flowllm/context/flow_context.py +28 -0
- llmflow/op/prompt_mixin.py → flowllm/context/prompt_handler.py +25 -14
- flowllm/context/registry.py +26 -0
- flowllm/context/service_context.py +103 -0
- flowllm/embedding_model/__init__.py +1 -0
- {llmflow → flowllm}/embedding_model/base_embedding_model.py +2 -2
- {llmflow → flowllm}/embedding_model/openai_compatible_embedding_model.py +8 -8
- flowllm/flow_engine/__init__.py +1 -0
- flowllm/flow_engine/base_flow_engine.py +34 -0
- flowllm/flow_engine/simple_flow_engine.py +213 -0
- flowllm/llm/__init__.py +1 -0
- {llmflow → flowllm}/llm/base_llm.py +16 -24
- {llmflow → flowllm}/llm/openai_compatible_llm.py +64 -108
- flowllm/op/__init__.py +3 -0
- flowllm/op/akshare/get_ak_a_code_op.py +116 -0
- flowllm/op/akshare/get_ak_a_code_prompt.yaml +21 -0
- flowllm/op/akshare/get_ak_a_info_op.py +143 -0
- flowllm/op/base_op.py +169 -0
- flowllm/op/llm_base_op.py +63 -0
- flowllm/op/mock_op.py +42 -0
- flowllm/op/parallel_op.py +30 -0
- flowllm/op/sequential_op.py +29 -0
- flowllm/schema/flow_response.py +12 -0
- flowllm/schema/message.py +35 -0
- flowllm/schema/service_config.py +76 -0
- flowllm/schema/tool_call.py +110 -0
- flowllm/service/__init__.py +2 -0
- flowllm/service/base_service.py +59 -0
- flowllm/service/http_service.py +87 -0
- flowllm/service/mcp_service.py +45 -0
- flowllm/storage/__init__.py +1 -0
- flowllm/storage/vector_store/__init__.py +3 -0
- flowllm/storage/vector_store/base_vector_store.py +44 -0
- {llmflow → flowllm/storage}/vector_store/chroma_vector_store.py +11 -10
- {llmflow → flowllm/storage}/vector_store/es_vector_store.py +10 -9
- llmflow/vector_store/file_vector_store.py → flowllm/storage/vector_store/local_vector_store.py +110 -10
- flowllm/utils/common_utils.py +64 -0
- flowllm/utils/dataframe_cache.py +331 -0
- flowllm/utils/fetch_url.py +113 -0
- {llmflow → flowllm}/utils/timer.py +5 -4
- {flowllm-0.1.0.dist-info → flowllm-0.1.1.dist-info}/METADATA +31 -27
- flowllm-0.1.1.dist-info/RECORD +62 -0
- flowllm-0.1.1.dist-info/entry_points.txt +4 -0
- {flowllm-0.1.0.dist-info → flowllm-0.1.1.dist-info}/licenses/LICENSE +1 -1
- flowllm-0.1.1.dist-info/top_level.txt +1 -0
- flowllm-0.1.0.dist-info/RECORD +0 -66
- flowllm-0.1.0.dist-info/entry_points.txt +0 -3
- flowllm-0.1.0.dist-info/top_level.txt +0 -1
- llmflow/app.py +0 -53
- llmflow/config/config_parser.py +0 -80
- llmflow/config/mock_config.yaml +0 -58
- llmflow/embedding_model/__init__.py +0 -5
- llmflow/enumeration/agent_state.py +0 -8
- llmflow/llm/__init__.py +0 -5
- llmflow/mcp_server.py +0 -110
- llmflow/op/__init__.py +0 -10
- llmflow/op/base_op.py +0 -125
- llmflow/op/mock_op.py +0 -40
- llmflow/op/react/react_v1_op.py +0 -88
- llmflow/op/react/react_v1_prompt.yaml +0 -28
- llmflow/op/vector_store/__init__.py +0 -13
- llmflow/op/vector_store/recall_vector_store_op.py +0 -48
- llmflow/op/vector_store/update_vector_store_op.py +0 -28
- llmflow/op/vector_store/vector_store_action_op.py +0 -46
- llmflow/pipeline/pipeline.py +0 -94
- llmflow/pipeline/pipeline_context.py +0 -37
- llmflow/schema/app_config.py +0 -69
- llmflow/schema/experience.py +0 -144
- llmflow/schema/message.py +0 -68
- llmflow/schema/request.py +0 -32
- llmflow/schema/response.py +0 -29
- llmflow/service/__init__.py +0 -0
- llmflow/service/llmflow_service.py +0 -96
- llmflow/tool/__init__.py +0 -9
- llmflow/tool/base_tool.py +0 -80
- llmflow/tool/code_tool.py +0 -43
- llmflow/tool/dashscope_search_tool.py +0 -162
- llmflow/tool/mcp_tool.py +0 -77
- llmflow/tool/tavily_search_tool.py +0 -109
- llmflow/tool/terminate_tool.py +0 -23
- llmflow/utils/__init__.py +0 -0
- llmflow/utils/common_utils.py +0 -17
- llmflow/utils/file_handler.py +0 -25
- llmflow/utils/http_client.py +0 -156
- llmflow/utils/op_utils.py +0 -102
- llmflow/utils/registry.py +0 -33
- llmflow/vector_store/__init__.py +0 -7
- llmflow/vector_store/base_vector_store.py +0 -136
- {llmflow → flowllm/config}/__init__.py +0 -0
- {llmflow/config → flowllm/context}/__init__.py +0 -0
- {llmflow → flowllm}/enumeration/__init__.py +0 -0
- {llmflow → flowllm}/enumeration/chunk_enum.py +0 -0
- {llmflow → flowllm}/enumeration/http_enum.py +0 -0
- {llmflow → flowllm}/enumeration/role.py +0 -0
- {llmflow/op/react → flowllm/op/akshare}/__init__.py +0 -0
- {llmflow/pipeline → flowllm/schema}/__init__.py +0 -0
- {llmflow → flowllm}/schema/vector_node.py +0 -0
- {llmflow/schema → flowllm/utils}/__init__.py +0 -0
- {llmflow → flowllm}/utils/singleton.py +0 -0
- {flowllm-0.1.0.dist-info → flowllm-0.1.1.dist-info}/WHEEL +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: flowllm
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.1
|
4
4
|
Summary: build llm flow
|
5
5
|
License: Apache License
|
6
6
|
Version 2.0, January 2004
|
@@ -190,7 +190,7 @@ License: Apache License
|
|
190
190
|
same "printed page" as the copyright notice for easier
|
191
191
|
identification within third-party archives.
|
192
192
|
|
193
|
-
Copyright 2024
|
193
|
+
Copyright 2024 FlowLLM
|
194
194
|
|
195
195
|
Licensed under the Apache License, Version 2.0 (the "License");
|
196
196
|
you may not use this file except in compliance with the License.
|
@@ -223,14 +223,15 @@ Requires-Dist: PyYAML>=6.0.2
|
|
223
223
|
Requires-Dist: Requests>=2.32.4
|
224
224
|
Requires-Dist: uvicorn>=0.34.3
|
225
225
|
Requires-Dist: setuptools>=75.0
|
226
|
+
Requires-Dist: akshare
|
226
227
|
Dynamic: license-file
|
227
228
|
|
228
|
-
#
|
229
|
+
# flowllm
|
229
230
|
|
230
231
|
[](https://www.python.org/downloads/)
|
231
232
|
[](https://opensource.org/licenses/Apache-2.0)
|
232
233
|
|
233
|
-
|
234
|
+
flowllm is a flexible large language model workflow framework that provides a modular pipeline architecture for building complex AI applications. The framework supports multiple LLM providers, vector storage backends, and tool integrations, enabling you to easily build Retrieval-Augmented Generation (RAG), intelligent agents, and other AI-powered applications.
|
234
235
|
|
235
236
|
## 🚀 Key Features
|
236
237
|
|
@@ -274,8 +275,8 @@ LLMFlow is a flexible large language model workflow framework that provides a mo
|
|
274
275
|
|
275
276
|
```bash
|
276
277
|
# Clone the repository
|
277
|
-
git clone https://github.com/your-username/
|
278
|
-
cd
|
278
|
+
git clone https://github.com/your-username/flowllm.git
|
279
|
+
cd flowllm
|
279
280
|
|
280
281
|
# Install dependencies
|
281
282
|
pip install -e .
|
@@ -314,7 +315,7 @@ DASHSCOPE_API_KEY=sk-your-dashscope-key
|
|
314
315
|
### 1. Start HTTP Service
|
315
316
|
|
316
317
|
```bash
|
317
|
-
|
318
|
+
flowllm \
|
318
319
|
http_service.port=8001 \
|
319
320
|
llm.default.model_name=qwen3-32b \
|
320
321
|
embedding_model.default.model_name=text-embedding-v4 \
|
@@ -324,7 +325,7 @@ llmflow \
|
|
324
325
|
### 2. Start MCP Server
|
325
326
|
|
326
327
|
```bash
|
327
|
-
|
328
|
+
flowllm_mcp \
|
328
329
|
mcp_transport=stdio \
|
329
330
|
http_service.port=8001 \
|
330
331
|
llm.default.model_name=qwen3-32b \
|
@@ -361,7 +362,7 @@ print(response.json())
|
|
361
362
|
|
362
363
|
### Pipeline Configuration Syntax
|
363
364
|
|
364
|
-
|
365
|
+
flowllm uses an intuitive string syntax to define operation pipelines:
|
365
366
|
|
366
367
|
```yaml
|
367
368
|
api:
|
@@ -444,7 +445,7 @@ vector_store:
|
|
444
445
|
└───────────────────────┼───────────────────────┘
|
445
446
|
│
|
446
447
|
┌─────────────────┐
|
447
|
-
│
|
448
|
+
│ flowllm Service │
|
448
449
|
└─────────────────┘
|
449
450
|
│
|
450
451
|
┌─────────────────┐
|
@@ -475,8 +476,9 @@ Request → Configuration → Pipeline → Operations → Tools/VectorStore →
|
|
475
476
|
### Custom Operations
|
476
477
|
|
477
478
|
```python
|
478
|
-
from
|
479
|
-
from
|
479
|
+
from old.op import OP_REGISTRY
|
480
|
+
from old.op.base_op import BaseOp
|
481
|
+
|
480
482
|
|
481
483
|
@OP_REGISTRY.register()
|
482
484
|
class CustomOp(BaseOp):
|
@@ -484,10 +486,10 @@ class CustomOp(BaseOp):
|
|
484
486
|
# Implement your custom logic
|
485
487
|
request = self.context.request
|
486
488
|
response = self.context.response
|
487
|
-
|
489
|
+
|
488
490
|
# Process request
|
489
491
|
result = self.process_data(request.query)
|
490
|
-
|
492
|
+
|
491
493
|
# Update response
|
492
494
|
response.metadata["custom_result"] = result
|
493
495
|
```
|
@@ -495,8 +497,9 @@ class CustomOp(BaseOp):
|
|
495
497
|
### Custom Tools
|
496
498
|
|
497
499
|
```python
|
498
|
-
from
|
499
|
-
from
|
500
|
+
from old.tool import TOOL_REGISTRY
|
501
|
+
from old.tool.base_tool import BaseTool
|
502
|
+
|
500
503
|
|
501
504
|
@TOOL_REGISTRY.register()
|
502
505
|
class CustomTool(BaseTool):
|
@@ -509,7 +512,7 @@ class CustomTool(BaseTool):
|
|
509
512
|
},
|
510
513
|
"required": ["input"]
|
511
514
|
}
|
512
|
-
|
515
|
+
|
513
516
|
def _execute(self, input: str, **kwargs):
|
514
517
|
# Implement tool logic
|
515
518
|
return f"Processing result: {input}"
|
@@ -518,15 +521,16 @@ class CustomTool(BaseTool):
|
|
518
521
|
### Custom Vector Stores
|
519
522
|
|
520
523
|
```python
|
521
|
-
from
|
522
|
-
from
|
524
|
+
from old.vector_store import VECTOR_STORE_REGISTRY
|
525
|
+
from old.vector_store.base_vector_store import BaseVectorStore
|
526
|
+
|
523
527
|
|
524
528
|
@VECTOR_STORE_REGISTRY.register("custom_store")
|
525
529
|
class CustomVectorStore(BaseVectorStore):
|
526
530
|
def search(self, query: str, top_k: int = 10, **kwargs):
|
527
531
|
# Implement search logic
|
528
532
|
pass
|
529
|
-
|
533
|
+
|
530
534
|
def insert(self, nodes: List[VectorNode], **kwargs):
|
531
535
|
# Implement insertion logic
|
532
536
|
pass
|
@@ -542,7 +546,7 @@ pytest
|
|
542
546
|
pytest tests/test_pipeline.py
|
543
547
|
|
544
548
|
# Generate coverage report
|
545
|
-
pytest --cov=
|
549
|
+
pytest --cov=flowllm tests/
|
546
550
|
```
|
547
551
|
|
548
552
|
## 🤝 Contributing
|
@@ -565,11 +569,11 @@ pip install -e ".[dev]"
|
|
565
569
|
pre-commit install
|
566
570
|
|
567
571
|
# Run code formatting
|
568
|
-
black
|
569
|
-
isort
|
572
|
+
black flowllm/
|
573
|
+
isort flowllm/
|
570
574
|
|
571
575
|
# Run type checking
|
572
|
-
mypy
|
576
|
+
mypy flowllm/
|
573
577
|
```
|
574
578
|
|
575
579
|
## 📚 Documentation
|
@@ -582,7 +586,7 @@ mypy llmflow/
|
|
582
586
|
|
583
587
|
## 🐛 Bug Reports
|
584
588
|
|
585
|
-
If you find bugs or have feature requests, please create an issue on [GitHub Issues](https://github.com/your-username/
|
589
|
+
If you find bugs or have feature requests, please create an issue on [GitHub Issues](https://github.com/your-username/flowllm/issues).
|
586
590
|
|
587
591
|
## 📄 License
|
588
592
|
|
@@ -590,8 +594,8 @@ This project is licensed under the Apache License 2.0. See the [LICENSE](LICENSE
|
|
590
594
|
|
591
595
|
## 🙏 Acknowledgments
|
592
596
|
|
593
|
-
Thanks to all developers and community members who have contributed to the
|
597
|
+
Thanks to all developers and community members who have contributed to the flowllm project.
|
594
598
|
|
595
599
|
---
|
596
600
|
|
597
|
-
**
|
601
|
+
**flowllm** - Making AI workflow development simple and powerful 🚀
|
@@ -0,0 +1,62 @@
|
|
1
|
+
flowllm/__init__.py,sha256=26Kp9GihT8ffNaUVNZIPq3mp0gp2iLgHMX_Yq5ot04Y,237
|
2
|
+
flowllm/app.py,sha256=4NGAPrFMJB9dHVp7_AUbi8gSHDJjaE0I80Z1Jx-TSVQ,654
|
3
|
+
flowllm/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
+
flowllm/config/default_config.yaml,sha256=nqjz9r5B8Tyx2hH8mZpMmZgS7Hv4XgjpEGs0n6K5VdY,2038
|
5
|
+
flowllm/config/pydantic_config_parser.py,sha256=pIrryo79YW9Otx3P4KQm2u_80_MmpQBKRwcK8wyQJkQ,6947
|
6
|
+
flowllm/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
|
+
flowllm/context/base_context.py,sha256=R8uP3I-cLIJBodGfGlbUaBJ1pqCTbMasn3pkCFoCKVQ,1441
|
8
|
+
flowllm/context/flow_context.py,sha256=xcXUWxjsiyjHDe5QoT8KJGmeyXITBw0zkZV6qIDKCOQ,811
|
9
|
+
flowllm/context/prompt_handler.py,sha256=LbMJDwrzz8HF7HVDyphVSWI1X4QHMebJqLP4XeXkXOE,2667
|
10
|
+
flowllm/context/registry.py,sha256=UvF-Exrzp7vt9bpfa4EdpbwmbqhbLJokvW2cht1Gm8o,897
|
11
|
+
flowllm/context/service_context.py,sha256=-FMmB-NgTxRdCXepbzukVmynh3BqBZibP2ifuSf0R7s,3497
|
12
|
+
flowllm/embedding_model/__init__.py,sha256=n0du4LYWRXlXDJDZRYE5h2CFeyAIPU76BHpdVU2UFG4,101
|
13
|
+
flowllm/embedding_model/base_embedding_model.py,sha256=kONFQF-pljIEW3Zn2FSr2hIDCzahmmsLsXj8zjmW4Rg,4295
|
14
|
+
flowllm/embedding_model/openai_compatible_embedding_model.py,sha256=x7nQh4uaReIWyDt9ffr9xOaeoIR4hgp0VxcZgTIOyPg,3479
|
15
|
+
flowllm/enumeration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
16
|
+
flowllm/enumeration/chunk_enum.py,sha256=EYB0a84qtrph5H7h_m05Qeo5B00B3xnSOt9KBb5CCJY,152
|
17
|
+
flowllm/enumeration/http_enum.py,sha256=ddIYeVz2J8CInzEkhWbz1rPe0qh2FVfryNNE1uc1ioM,141
|
18
|
+
flowllm/enumeration/role.py,sha256=SFMGXmwYFndGIwbr9GxS3OIoHIZ_nO23DeRnqpV4U3g,133
|
19
|
+
flowllm/flow_engine/__init__.py,sha256=bzS4GjSsNA-IzjoA9E1o1JnbYbzSZlCxXyGsDohweKE,50
|
20
|
+
flowllm/flow_engine/base_flow_engine.py,sha256=Iy48HNLXFwTOCWY_eU-xFtQaqZFIubNfQqoYB1V64xU,900
|
21
|
+
flowllm/flow_engine/simple_flow_engine.py,sha256=7Us1G90O0HRnZ1JIlq9pvxBqENyhIJu6hqr7AIq6IVA,7645
|
22
|
+
flowllm/llm/__init__.py,sha256=ItnDIENsu1vSMaIVjVZ5fvHH5rtesM43_U_dZGPiaQk,70
|
23
|
+
flowllm/llm/base_llm.py,sha256=JmPxLdp-x0T7QpzTO_odJgkjWclfEsTPWlbRGp00BPA,5746
|
24
|
+
flowllm/llm/openai_compatible_llm.py,sha256=vwxs6MdCVx0_bcw_IoLxvpdu3mZlRcFkrF2wp81y0Wo,9965
|
25
|
+
flowllm/op/__init__.py,sha256=t4Xo1weDuiL_5B7aPLs7YEq4bBPFq3kEnojJgPiD1lk,292
|
26
|
+
flowllm/op/base_op.py,sha256=K-UoAAj2OGK7_QMgmKJw6rwx2lb4tLzeRio3l3QSDz0,4813
|
27
|
+
flowllm/op/llm_base_op.py,sha256=L_M8PvXiElsZW6-i9DXhcnNo84crgGMHleQ52niGlxg,2655
|
28
|
+
flowllm/op/mock_op.py,sha256=Y2tyIf5GeZgogCmUJKaFdX1U3ZS7GNITU-AP3-9u6XE,679
|
29
|
+
flowllm/op/parallel_op.py,sha256=_6FzBmnqYuNKgXwLpwKru8RRjieyuGMyvBPnEhuizJs,849
|
30
|
+
flowllm/op/sequential_op.py,sha256=7BeCxdEoDV0AnvRcBkfox7yMAVg8m55vWqjtD_uzUVg,759
|
31
|
+
flowllm/op/akshare/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
32
|
+
flowllm/op/akshare/get_ak_a_code_op.py,sha256=otD1cszLbBB-2NNJnbGdJSNfHasayD63a-yX34IPln0,4194
|
33
|
+
flowllm/op/akshare/get_ak_a_code_prompt.yaml,sha256=NwGJygecUwspQvrg98GdMpcmQESpZ2Kf5YprhM2PyZU,608
|
34
|
+
flowllm/op/akshare/get_ak_a_info_op.py,sha256=BSHt22Q-1o_StaFp5wR09ThZZgGjPbA8dKtTJvvJq5g,4830
|
35
|
+
flowllm/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
36
|
+
flowllm/schema/flow_response.py,sha256=BusrfkJ8OCGk9Tp1KCWVSt33L2t_pYpn9QRqS0bjDcw,323
|
37
|
+
flowllm/schema/message.py,sha256=yxbKvH7TRECozUYdm141q84QGoqyOe3krSXgzWRdWHs,1220
|
38
|
+
flowllm/schema/service_config.py,sha256=4DmveDy_ly0bguhU85NerBIz_oIASdFAaHg_qVQpbBk,2381
|
39
|
+
flowllm/schema/tool_call.py,sha256=va8veCNB0WB2kEjud1AP8gVUVgwMZgw3vOlijnMUugs,3724
|
40
|
+
flowllm/schema/vector_node.py,sha256=2s6YALIYtj1n7iYsfA7W0WhVunuQBobm8rQoMyAgF3Y,361
|
41
|
+
flowllm/service/__init__.py,sha256=3qVEcHwG8qhdC1TSoU4t8kLCJykMxBYKIPwK7vVVM5U,103
|
42
|
+
flowllm/service/base_service.py,sha256=cH4mAoRdBEXBAaWbdi-L7VmGbQvc1StPRKzZB8rGDRM,2833
|
43
|
+
flowllm/service/http_service.py,sha256=lFN-PNmxkHjl3MdB874jFe-7-27iC4tYQZLwNPvgAEc,3205
|
44
|
+
flowllm/service/mcp_service.py,sha256=SVhfgZrioX_9hLK5DgEwqFjcgDMvKMubos08nFbGqfQ,1616
|
45
|
+
flowllm/storage/__init__.py,sha256=wlGDDqp6nM4TLoEAXtSglgB0-K2YHAq_DNnsHTBQj8s,41
|
46
|
+
flowllm/storage/vector_store/__init__.py,sha256=o1U7UIVoonOj36Rm-0pUnQaKENOzlG81a7gWPj_Tx2U,227
|
47
|
+
flowllm/storage/vector_store/base_vector_store.py,sha256=V5b3kux6rJROjyMZzzHu_09ornvO_zZzcPgzZFF8Hv0,1635
|
48
|
+
flowllm/storage/vector_store/chroma_vector_store.py,sha256=BHcfhMBBDaoQOywfhYgp87v6OjTf0ePyTI2h-MWQywc,7067
|
49
|
+
flowllm/storage/vector_store/es_vector_store.py,sha256=qbyQVZ-ONV2Aw82-8oERsN82allYtayAx1Bj_1D9YGE,8448
|
50
|
+
flowllm/storage/vector_store/local_vector_store.py,sha256=-JZ0l78jGyWWo5Sr9LVUldjKgjQUbVp4foLLU64w37I,10397
|
51
|
+
flowllm/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
52
|
+
flowllm/utils/common_utils.py,sha256=wb4nKF-GE53eYFrH1UYltKIJ27Z0uSOa9AMvK66noyg,1550
|
53
|
+
flowllm/utils/dataframe_cache.py,sha256=JpSAL3yKeIOhgA-DEhhadzSClFIj-m45zbXsNHUb1_0,9725
|
54
|
+
flowllm/utils/fetch_url.py,sha256=wuH_1MB__DquYzrZD-a5VgOnJB-sZvw1xEpRo5SjFqc,4431
|
55
|
+
flowllm/utils/singleton.py,sha256=No3otyPDRHu6wQuFRC-w28MkbommVFTLd7H4mT6-Zos,213
|
56
|
+
flowllm/utils/timer.py,sha256=8aj3dIYOyxNDNdlcitezdepxEptqkx69aw6JNFWsr30,1492
|
57
|
+
flowllm-0.1.1.dist-info/licenses/LICENSE,sha256=kFfPsL7YvEW4jPATpyvUPdtEgftLK53zQrVYJ0eBASY,11337
|
58
|
+
flowllm-0.1.1.dist-info/METADATA,sha256=wMnmj5yEAUrSebhVHblwPEY8vCqix8-nVMJ19iVTCPM,24229
|
59
|
+
flowllm-0.1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
60
|
+
flowllm-0.1.1.dist-info/entry_points.txt,sha256=7U3zwalx4qZGw2uWsDhSjo-xJB094M2plYsbXKk9ouk,113
|
61
|
+
flowllm-0.1.1.dist-info/top_level.txt,sha256=a2tZBwbrnw4uiydMI5kAEGz-cxG25rf6v0QM1sYIrjs,8
|
62
|
+
flowllm-0.1.1.dist-info/RECORD,,
|
@@ -186,7 +186,7 @@
|
|
186
186
|
same "printed page" as the copyright notice for easier
|
187
187
|
identification within third-party archives.
|
188
188
|
|
189
|
-
Copyright 2024
|
189
|
+
Copyright 2024 FlowLLM
|
190
190
|
|
191
191
|
Licensed under the Apache License, Version 2.0 (the "License");
|
192
192
|
you may not use this file except in compliance with the License.
|
@@ -0,0 +1 @@
|
|
1
|
+
flowllm
|
flowllm-0.1.0.dist-info/RECORD
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
flowllm-0.1.0.dist-info/licenses/LICENSE,sha256=CpH4VoknEI82jjSPd8K3jQLwvrRAM9LwJAOnppzo-Jk,11343
|
2
|
-
llmflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
-
llmflow/app.py,sha256=lArBS_VusANTkdzAT2deS14HY5_trVCweKfSX45jqPo,1621
|
4
|
-
llmflow/mcp_server.py,sha256=hO4QoqKSqaJJ42cVwuLwQ-MgVKn0UB7gQcUS7MOcgu8,3086
|
5
|
-
llmflow/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
-
llmflow/config/config_parser.py,sha256=htypaDcT_-he-wexG75usKkQXHyOaDbQAwANWq5aSbI,3214
|
7
|
-
llmflow/config/mock_config.yaml,sha256=0I66Tz5sXHgU-_EoO8hOyqXEmncXTLoS6JoPkizC6jw,995
|
8
|
-
llmflow/embedding_model/__init__.py,sha256=u5QQPmBmJ1ISom5bI--vrAldMZ3RlMEhY5Uh0wNoLVI,185
|
9
|
-
llmflow/embedding_model/base_embedding_model.py,sha256=vijZE1k2Q27wRrDSF2UYZ1I70Hj9iZPkdiWC_-t4csI,4298
|
10
|
-
llmflow/embedding_model/openai_compatible_embedding_model.py,sha256=7y7ttySiB3_dqwQh9d6fk0KgJ48-97-0yQ1ThgLpc8c,3549
|
11
|
-
llmflow/enumeration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
|
-
llmflow/enumeration/agent_state.py,sha256=BCBj13fm29oTb-MdsVtbW_flmsWEAYpideMD5xkG2B4,143
|
13
|
-
llmflow/enumeration/chunk_enum.py,sha256=EYB0a84qtrph5H7h_m05Qeo5B00B3xnSOt9KBb5CCJY,152
|
14
|
-
llmflow/enumeration/http_enum.py,sha256=ddIYeVz2J8CInzEkhWbz1rPe0qh2FVfryNNE1uc1ioM,141
|
15
|
-
llmflow/enumeration/role.py,sha256=SFMGXmwYFndGIwbr9GxS3OIoHIZ_nO23DeRnqpV4U3g,133
|
16
|
-
llmflow/llm/__init__.py,sha256=u6FdiMYZMbnMbCgOJ-_4vwfOkNtpoG1jxwVhJTWOIhc,142
|
17
|
-
llmflow/llm/base_llm.py,sha256=EtaUpeFX-gEApwRJYkIdfVjKivbFwg5tGSe6P9lZrHM,5906
|
18
|
-
llmflow/llm/openai_compatible_llm.py,sha256=ib6aUiFEsj2i2G8yP5grnV-x2LIDIedU2rWj50FYbAU,11761
|
19
|
-
llmflow/op/__init__.py,sha256=aFyZt6OD_FdXAESTnOdXVfcvQ47JvOcMLxCxNbs5qiE,444
|
20
|
-
llmflow/op/base_op.py,sha256=vQroEM8eoRRWnfsPN5c_FQBxUOnGVObzUxEuoQ3wArc,4901
|
21
|
-
llmflow/op/mock_op.py,sha256=_mWuRayUyrAebmawbzISLAXN2UBjZNRVPZGL7R3Njrs,639
|
22
|
-
llmflow/op/prompt_mixin.py,sha256=MeD9QSy95It2UhCnfSl1qTHY6DGh2h5OAcqZw99VNdE,2217
|
23
|
-
llmflow/op/react/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
24
|
-
llmflow/op/react/react_v1_op.py,sha256=rx-paa046IkZcj-92D1lqFXShelHrSddKdWfuVXZW9g,3923
|
25
|
-
llmflow/op/react/react_v1_prompt.yaml,sha256=XL8NLutlT5cuJAbWxw1Acu4NKuBoHx5h9iXVr-c30js,1552
|
26
|
-
llmflow/op/vector_store/__init__.py,sha256=xPNPugGcV9h2p5p83mII-fSTwAWgtjPH8pIYQeRhozo,465
|
27
|
-
llmflow/op/vector_store/recall_vector_store_op.py,sha256=AfRKZ8K9iFuG3RgIei-ZgcP7l5oyL1nh_L5IuFJRqFQ,2020
|
28
|
-
llmflow/op/vector_store/update_vector_store_op.py,sha256=ti3fQDaCxlGxTmJzitYhpcXbRviIU1Nb0rXKpxdvbMg,1124
|
29
|
-
llmflow/op/vector_store/vector_store_action_op.py,sha256=4TKDvVWPmJrNCser7qlbXMISMh5JAdKjt5Skqn1l8uI,2071
|
30
|
-
llmflow/pipeline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
31
|
-
llmflow/pipeline/pipeline.py,sha256=QLmOyVeT8RsZyxPRUuucbHlOQ9BC_ctO2436rRULZas,3493
|
32
|
-
llmflow/pipeline/pipeline_context.py,sha256=JYsReQKoejMi08gJ_ya1QiGM6mBqOaVERWcfF4IECuI,961
|
33
|
-
llmflow/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
34
|
-
llmflow/schema/app_config.py,sha256=Ql8NLtGSLdkYd3ILBSIajKZhZapsoDgiZSS306bc0yo,2020
|
35
|
-
llmflow/schema/experience.py,sha256=Al50tleJakm1f7kO75pnCeo6kEG_D4TkQ35viD5sERA,4881
|
36
|
-
llmflow/schema/message.py,sha256=_zDuNUY2rFhNURv-1lEsQ_i7detryCrtznlD_U3oMFU,2122
|
37
|
-
llmflow/schema/request.py,sha256=qHzQGa8nUoDHGzMLwujR03z3yXQwgxSX9hPrSjXlD3s,801
|
38
|
-
llmflow/schema/response.py,sha256=KHdXX6u3E73QbC4sOIYC-jFClclyMIBY_FnrnZIoodQ,805
|
39
|
-
llmflow/schema/vector_node.py,sha256=2s6YALIYtj1n7iYsfA7W0WhVunuQBobm8rQoMyAgF3Y,361
|
40
|
-
llmflow/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
41
|
-
llmflow/service/llmflow_service.py,sha256=Hpi_9ZfrJBrESRQUGB39sl640rVezkTTRtNg2aLrJVo,4314
|
42
|
-
llmflow/tool/__init__.py,sha256=A9hPcg6zX0O5k9_A6fOVbTj5wiMbUjuNFFnZLlweBBA,341
|
43
|
-
llmflow/tool/base_tool.py,sha256=3iCvqsh-SKOfIXDuR5XhtkgzjBsmgoj9YEnPxRchDNE,2633
|
44
|
-
llmflow/tool/code_tool.py,sha256=SivJxGZrzFOJ0c-wYU8ftM6AdFdQOnFOxZdTATbQnss,1190
|
45
|
-
llmflow/tool/dashscope_search_tool.py,sha256=7MHm-qATu6CsB4_8tSsjWV_61fC758DbqgboRD0DaDE,6136
|
46
|
-
llmflow/tool/mcp_tool.py,sha256=c1dYW0TLERov15BtwPJPcvl6L1h-O3Xn4SI9VjeuqIQ,2918
|
47
|
-
llmflow/tool/tavily_search_tool.py,sha256=eAtaVIzcURLcm_VA4HjOZJMQs0YjkwzBjyk9JxfcfDo,3646
|
48
|
-
llmflow/tool/terminate_tool.py,sha256=6HR-uUlgzZoI6y8QTu30ug91kUUvPIVVO6iuo3uBlWU,825
|
49
|
-
llmflow/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
50
|
-
llmflow/utils/common_utils.py,sha256=RZ7lq_j9tyVkSrlaqfsrAcEIiu58BXHKIdueHtGPU84,363
|
51
|
-
llmflow/utils/file_handler.py,sha256=-M_p4AGn5FtaD7wrzdmMFQvsQtr_4IsS05j9gizobL4,664
|
52
|
-
llmflow/utils/http_client.py,sha256=LJgdbzdQ8e7X6D_pyy0JQ3RY5AItfVNiNpOEJsJOqu8,6196
|
53
|
-
llmflow/utils/op_utils.py,sha256=q2dU5G4-fmOhXogJG5ca7uQczuHDYu4rQooWWgmysz8,3807
|
54
|
-
llmflow/utils/registry.py,sha256=OFbmp1y5aVtqczPDrfT74M8hLoNeoWKcOdsT-OczoUc,921
|
55
|
-
llmflow/utils/singleton.py,sha256=No3otyPDRHu6wQuFRC-w28MkbommVFTLd7H4mT6-Zos,213
|
56
|
-
llmflow/utils/timer.py,sha256=qccPMh27euWIE9m6hZ1N_kDRwfEN97qPhZis68ktLNs,1443
|
57
|
-
llmflow/vector_store/__init__.py,sha256=Zk9mkH3ii9WPchQcG_KHFO89jwHIKZvuvFpr8WRmy-E,282
|
58
|
-
llmflow/vector_store/base_vector_store.py,sha256=_ciUZ52bqyDiaFzKzB5me_wYXsrNDt0PyQzBQQlgYO4,5517
|
59
|
-
llmflow/vector_store/chroma_vector_store.py,sha256=IcTL2-jqy8Tltkml5dn6L29nDcDhX59f500fqeTp5z8,7084
|
60
|
-
llmflow/vector_store/es_vector_store.py,sha256=9kl7KmQBOZSKlHnyrVNXGx4o7Xi7LRurAbB0-8_dPUo,8447
|
61
|
-
llmflow/vector_store/file_vector_store.py,sha256=9KbixHdqm8R32xMVmNqVXqjhjvv0maAsvMnuW7SkII0,6184
|
62
|
-
flowllm-0.1.0.dist-info/METADATA,sha256=89YrxJzuRmT4b_SRXlRgHPK2gff83CeY7StnYuJAMmA,24257
|
63
|
-
flowllm-0.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
64
|
-
flowllm-0.1.0.dist-info/entry_points.txt,sha256=LxjuRXqMQ3J95vPC_1i7OAhlJX1rXmklOYi2KOLfKpM,83
|
65
|
-
flowllm-0.1.0.dist-info/top_level.txt,sha256=Hv7BK14mg2npiZaCmy-T2TSABJZHh7YKrOeEs0gPrPI,8
|
66
|
-
flowllm-0.1.0.dist-info/RECORD,,
|
@@ -1 +0,0 @@
|
|
1
|
-
llmflow
|
llmflow/app.py
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
import sys
|
2
|
-
|
3
|
-
import uvicorn
|
4
|
-
from dotenv import load_dotenv
|
5
|
-
from fastapi import FastAPI
|
6
|
-
|
7
|
-
from llmflow.schema.request import RetrieverRequest, SummarizerRequest, VectorStoreRequest, AgentRequest
|
8
|
-
from llmflow.schema.response import RetrieverResponse, SummarizerResponse, VectorStoreResponse, AgentResponse
|
9
|
-
from llmflow.service.llmflow_service import LLMFlowService
|
10
|
-
|
11
|
-
load_dotenv()
|
12
|
-
|
13
|
-
app = FastAPI()
|
14
|
-
service = LLMFlowService(sys.argv[1:])
|
15
|
-
|
16
|
-
|
17
|
-
@app.post('/retriever', response_model=RetrieverResponse)
|
18
|
-
def call_retriever(request: RetrieverRequest):
|
19
|
-
return service(api="retriever", request=request)
|
20
|
-
|
21
|
-
|
22
|
-
@app.post('/summarizer', response_model=SummarizerResponse)
|
23
|
-
def call_summarizer(request: SummarizerRequest):
|
24
|
-
return service(api="summarizer", request=request)
|
25
|
-
|
26
|
-
|
27
|
-
@app.post('/vector_store', response_model=VectorStoreResponse)
|
28
|
-
def call_vector_store(request: VectorStoreRequest):
|
29
|
-
return service(api="vector_store", request=request)
|
30
|
-
|
31
|
-
|
32
|
-
@app.post('/agent', response_model=AgentResponse)
|
33
|
-
def call_agent(request: AgentRequest):
|
34
|
-
return service(api="agent", request=request)
|
35
|
-
|
36
|
-
|
37
|
-
def main():
|
38
|
-
uvicorn.run(app=app,
|
39
|
-
host=service.http_service_config.host,
|
40
|
-
port=service.http_service_config.port,
|
41
|
-
timeout_keep_alive=service.http_service_config.timeout_keep_alive,
|
42
|
-
limit_concurrency=service.http_service_config.limit_concurrency)
|
43
|
-
|
44
|
-
|
45
|
-
if __name__ == "__main__":
|
46
|
-
main()
|
47
|
-
|
48
|
-
# start with:
|
49
|
-
# llmflow \
|
50
|
-
# http_service.port=8001 \
|
51
|
-
# llm.default.model_name=qwen3-32b \
|
52
|
-
# embedding_model.default.model_name=text-embedding-v4 \
|
53
|
-
# vector_store.default.backend=local_file
|
llmflow/config/config_parser.py
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
import json
|
2
|
-
from pathlib import Path
|
3
|
-
|
4
|
-
from loguru import logger
|
5
|
-
from omegaconf import OmegaConf, DictConfig
|
6
|
-
|
7
|
-
from llmflow.schema.app_config import AppConfig
|
8
|
-
|
9
|
-
|
10
|
-
class ConfigParser:
|
11
|
-
"""
|
12
|
-
Configuration parser that handles loading and merging configurations from multiple sources.
|
13
|
-
|
14
|
-
The configuration loading priority (from lowest to highest):
|
15
|
-
1. Default configuration from AppConfig schema
|
16
|
-
2. YAML configuration file
|
17
|
-
3. Command line arguments
|
18
|
-
4. Runtime keyword arguments
|
19
|
-
"""
|
20
|
-
|
21
|
-
def __init__(self, args: list):
|
22
|
-
"""
|
23
|
-
Initialize the configuration parser with command line arguments.
|
24
|
-
|
25
|
-
Args:
|
26
|
-
args: List of command line arguments in dotlist format (e.g., ['key=value'])
|
27
|
-
"""
|
28
|
-
# Step 1: Initialize with default configuration from AppConfig schema
|
29
|
-
self.app_config: DictConfig = OmegaConf.structured(AppConfig)
|
30
|
-
|
31
|
-
# Step 2: Load configuration from YAML file
|
32
|
-
# First, parse CLI arguments to check if custom config path is specified
|
33
|
-
cli_config: DictConfig = OmegaConf.from_dotlist(args)
|
34
|
-
temp_config: AppConfig = OmegaConf.to_object(OmegaConf.merge(self.app_config, cli_config))
|
35
|
-
|
36
|
-
# Determine config file path: either from CLI args or use predefined config
|
37
|
-
if temp_config.config_path:
|
38
|
-
# Use custom config path if provided
|
39
|
-
config_path = Path(temp_config.config_path)
|
40
|
-
else:
|
41
|
-
# Use predefined config name from the config directory
|
42
|
-
pre_defined_config = temp_config.pre_defined_config
|
43
|
-
if not pre_defined_config.endswith(".yaml"):
|
44
|
-
pre_defined_config += ".yaml"
|
45
|
-
config_path = Path(__file__).parent / pre_defined_config
|
46
|
-
|
47
|
-
logger.info(f"load config from path={config_path}")
|
48
|
-
yaml_config = OmegaConf.load(config_path)
|
49
|
-
# Merge YAML config with default config
|
50
|
-
self.app_config = OmegaConf.merge(self.app_config, yaml_config)
|
51
|
-
|
52
|
-
# Step 3: Merge CLI arguments (highest priority)
|
53
|
-
self.app_config = OmegaConf.merge(self.app_config, cli_config)
|
54
|
-
|
55
|
-
# Log the final merged configuration
|
56
|
-
app_config_dict = OmegaConf.to_container(self.app_config, resolve=True)
|
57
|
-
logger.info(f"app_config=\n{json.dumps(app_config_dict, indent=2, ensure_ascii=False)}")
|
58
|
-
|
59
|
-
def get_app_config(self, **kwargs) -> AppConfig:
|
60
|
-
"""
|
61
|
-
Get the application configuration with optional runtime overrides.
|
62
|
-
|
63
|
-
Args:
|
64
|
-
**kwargs: Additional configuration parameters to override at runtime
|
65
|
-
|
66
|
-
Returns:
|
67
|
-
AppConfig: The final application configuration object
|
68
|
-
"""
|
69
|
-
# Create a copy of the current configuration
|
70
|
-
app_config = self.app_config.copy()
|
71
|
-
|
72
|
-
# Apply runtime overrides if provided
|
73
|
-
if kwargs:
|
74
|
-
# Convert kwargs to dotlist format for OmegaConf
|
75
|
-
kwargs_list = [f"{k}={v}" for k, v in kwargs.items()]
|
76
|
-
update_config = OmegaConf.from_dotlist(kwargs_list)
|
77
|
-
app_config = OmegaConf.merge(app_config, update_config)
|
78
|
-
|
79
|
-
# Convert OmegaConf DictConfig to structured AppConfig object
|
80
|
-
return OmegaConf.to_object(app_config)
|
llmflow/config/mock_config.yaml
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
# demo config.yaml
|
2
|
-
|
3
|
-
http_service:
|
4
|
-
host: "0.0.0.0"
|
5
|
-
port: 8001
|
6
|
-
timeout_keep_alive: 600
|
7
|
-
limit_concurrency: 64
|
8
|
-
|
9
|
-
thread_pool:
|
10
|
-
max_workers: 10
|
11
|
-
|
12
|
-
api:
|
13
|
-
retriever: mock1_op->[mock4_op->mock2_op|mock5_op]->[mock3_op|mock6_op]
|
14
|
-
summarizer: mock1_op->[mock4_op->mock2_op|mock5_op]->mock3_op
|
15
|
-
vector_store: mock6_op
|
16
|
-
|
17
|
-
op:
|
18
|
-
mock1_op:
|
19
|
-
backend: mock1_op
|
20
|
-
llm: default
|
21
|
-
vector_store: default
|
22
|
-
params:
|
23
|
-
a: 1
|
24
|
-
b: 2
|
25
|
-
mock2_op:
|
26
|
-
backend: mock2_op
|
27
|
-
params:
|
28
|
-
a: 1
|
29
|
-
mock3_op:
|
30
|
-
backend: mock3_op
|
31
|
-
mock4_op:
|
32
|
-
backend: mock4_op
|
33
|
-
mock5_op:
|
34
|
-
backend: mock5_op
|
35
|
-
mock6_op:
|
36
|
-
backend: mock6_op
|
37
|
-
|
38
|
-
llm:
|
39
|
-
default:
|
40
|
-
backend: openai_compatible
|
41
|
-
model_name: qwen3-32b
|
42
|
-
params:
|
43
|
-
temperature: 0.6
|
44
|
-
|
45
|
-
embedding_model:
|
46
|
-
default:
|
47
|
-
backend: openai_compatible
|
48
|
-
model_name: text-embedding-v4
|
49
|
-
params:
|
50
|
-
dimensions: 1024
|
51
|
-
|
52
|
-
vector_store:
|
53
|
-
default:
|
54
|
-
backend: elasticsearch
|
55
|
-
embedding_model: default
|
56
|
-
params:
|
57
|
-
hosts: "http://localhost:9200"
|
58
|
-
|
llmflow/llm/__init__.py
DELETED
llmflow/mcp_server.py
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
import sys
|
2
|
-
from typing import List
|
3
|
-
|
4
|
-
from dotenv import load_dotenv
|
5
|
-
from fastmcp import FastMCP
|
6
|
-
|
7
|
-
from llmflow.service.llmflow_service import LLMFlowService
|
8
|
-
|
9
|
-
load_dotenv()
|
10
|
-
|
11
|
-
mcp = FastMCP("llmflow")
|
12
|
-
service = LLMFlowService(sys.argv[1:])
|
13
|
-
|
14
|
-
|
15
|
-
@mcp.tool
|
16
|
-
def retriever(query: str,
|
17
|
-
messages: List[dict] = None,
|
18
|
-
top_k: int = 1,
|
19
|
-
workspace_id: str = "default",
|
20
|
-
config: dict = None) -> dict:
|
21
|
-
"""
|
22
|
-
Retrieve experiences from the workspace based on a query.
|
23
|
-
|
24
|
-
Args:
|
25
|
-
query: Query string
|
26
|
-
messages: List of messages
|
27
|
-
top_k: Number of top experiences to retrieve
|
28
|
-
workspace_id: Workspace identifier
|
29
|
-
config: Additional configuration parameters
|
30
|
-
|
31
|
-
Returns:
|
32
|
-
Dictionary containing retrieved experiences
|
33
|
-
"""
|
34
|
-
return service(api="retriever", request={
|
35
|
-
"query": query,
|
36
|
-
"messages": messages if messages else [],
|
37
|
-
"top_k": top_k,
|
38
|
-
"workspace_id": workspace_id,
|
39
|
-
"config": config if config else {},
|
40
|
-
}).model_dump()
|
41
|
-
|
42
|
-
|
43
|
-
@mcp.tool
|
44
|
-
def summarizer(traj_list: List[dict], workspace_id: str = "default", config: dict = None) -> dict:
|
45
|
-
"""
|
46
|
-
Summarize trajectories into experiences.
|
47
|
-
|
48
|
-
Args:
|
49
|
-
traj_list: List of trajectories
|
50
|
-
workspace_id: Workspace identifier
|
51
|
-
config: Additional configuration parameters
|
52
|
-
|
53
|
-
Returns:
|
54
|
-
experiences
|
55
|
-
"""
|
56
|
-
return service(api="summarizer", request={
|
57
|
-
"traj_list": traj_list,
|
58
|
-
"workspace_id": workspace_id,
|
59
|
-
"config": config if config else {},
|
60
|
-
}).model_dump()
|
61
|
-
|
62
|
-
|
63
|
-
@mcp.tool
|
64
|
-
def vector_store(action: str,
|
65
|
-
src_workspace_id: str = "",
|
66
|
-
workspace_id: str = "",
|
67
|
-
path: str = "./",
|
68
|
-
config: dict = None) -> dict:
|
69
|
-
"""
|
70
|
-
Perform vector store operations.
|
71
|
-
|
72
|
-
Args:
|
73
|
-
action: Action to perform (e.g., "copy", "delete", "dump", "load")
|
74
|
-
src_workspace_id: Source workspace identifier
|
75
|
-
workspace_id: Workspace identifier
|
76
|
-
path: Path to the vector store
|
77
|
-
config: Additional configuration parameters
|
78
|
-
|
79
|
-
Returns:
|
80
|
-
Dictionary containing the result of the vector store operation
|
81
|
-
"""
|
82
|
-
return service(api="vector_store", request={
|
83
|
-
"action": action,
|
84
|
-
"src_workspace_id": src_workspace_id,
|
85
|
-
"workspace_id": workspace_id,
|
86
|
-
"path": path,
|
87
|
-
"config": config if config else {},
|
88
|
-
}).model_dump()
|
89
|
-
|
90
|
-
|
91
|
-
def main():
|
92
|
-
mcp_transport: str = service.init_app_config.mcp_transport
|
93
|
-
if mcp_transport == "sse":
|
94
|
-
mcp.run(transport="sse", host=service.http_service_config.host, port=service.http_service_config.port)
|
95
|
-
elif mcp_transport == "stdio":
|
96
|
-
mcp.run(transport="stdio")
|
97
|
-
else:
|
98
|
-
raise ValueError(f"Unsupported mcp transport: {mcp_transport}")
|
99
|
-
|
100
|
-
|
101
|
-
if __name__ == "__main__":
|
102
|
-
main()
|
103
|
-
|
104
|
-
# start with:
|
105
|
-
# llmflow_mcp \
|
106
|
-
# mcp_transport=stdio \
|
107
|
-
# http_service.port=8001 \
|
108
|
-
# llm.default.model_name=qwen3-32b \
|
109
|
-
# embedding_model.default.model_name=text-embedding-v4 \
|
110
|
-
# vector_store.default.backend=local_file
|