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.
Files changed (105) hide show
  1. flowllm/__init__.py +12 -0
  2. flowllm/app.py +25 -0
  3. flowllm/config/default_config.yaml +82 -0
  4. flowllm/config/pydantic_config_parser.py +242 -0
  5. flowllm/context/base_context.py +59 -0
  6. flowllm/context/flow_context.py +28 -0
  7. llmflow/op/prompt_mixin.py → flowllm/context/prompt_handler.py +25 -14
  8. flowllm/context/registry.py +26 -0
  9. flowllm/context/service_context.py +103 -0
  10. flowllm/embedding_model/__init__.py +1 -0
  11. {llmflow → flowllm}/embedding_model/base_embedding_model.py +2 -2
  12. {llmflow → flowllm}/embedding_model/openai_compatible_embedding_model.py +8 -8
  13. flowllm/flow_engine/__init__.py +1 -0
  14. flowllm/flow_engine/base_flow_engine.py +34 -0
  15. flowllm/flow_engine/simple_flow_engine.py +213 -0
  16. flowllm/llm/__init__.py +1 -0
  17. {llmflow → flowllm}/llm/base_llm.py +16 -24
  18. {llmflow → flowllm}/llm/openai_compatible_llm.py +64 -108
  19. flowllm/op/__init__.py +3 -0
  20. flowllm/op/akshare/get_ak_a_code_op.py +116 -0
  21. flowllm/op/akshare/get_ak_a_code_prompt.yaml +21 -0
  22. flowllm/op/akshare/get_ak_a_info_op.py +143 -0
  23. flowllm/op/base_op.py +169 -0
  24. flowllm/op/llm_base_op.py +63 -0
  25. flowllm/op/mock_op.py +42 -0
  26. flowllm/op/parallel_op.py +30 -0
  27. flowllm/op/sequential_op.py +29 -0
  28. flowllm/schema/flow_response.py +12 -0
  29. flowllm/schema/message.py +35 -0
  30. flowllm/schema/service_config.py +76 -0
  31. flowllm/schema/tool_call.py +110 -0
  32. flowllm/service/__init__.py +2 -0
  33. flowllm/service/base_service.py +59 -0
  34. flowllm/service/http_service.py +87 -0
  35. flowllm/service/mcp_service.py +45 -0
  36. flowllm/storage/__init__.py +1 -0
  37. flowllm/storage/vector_store/__init__.py +3 -0
  38. flowllm/storage/vector_store/base_vector_store.py +44 -0
  39. {llmflow → flowllm/storage}/vector_store/chroma_vector_store.py +11 -10
  40. {llmflow → flowllm/storage}/vector_store/es_vector_store.py +10 -9
  41. llmflow/vector_store/file_vector_store.py → flowllm/storage/vector_store/local_vector_store.py +110 -10
  42. flowllm/utils/common_utils.py +64 -0
  43. flowllm/utils/dataframe_cache.py +331 -0
  44. flowllm/utils/fetch_url.py +113 -0
  45. {llmflow → flowllm}/utils/timer.py +5 -4
  46. {flowllm-0.1.0.dist-info → flowllm-0.1.1.dist-info}/METADATA +31 -27
  47. flowllm-0.1.1.dist-info/RECORD +62 -0
  48. flowllm-0.1.1.dist-info/entry_points.txt +4 -0
  49. {flowllm-0.1.0.dist-info → flowllm-0.1.1.dist-info}/licenses/LICENSE +1 -1
  50. flowllm-0.1.1.dist-info/top_level.txt +1 -0
  51. flowllm-0.1.0.dist-info/RECORD +0 -66
  52. flowllm-0.1.0.dist-info/entry_points.txt +0 -3
  53. flowllm-0.1.0.dist-info/top_level.txt +0 -1
  54. llmflow/app.py +0 -53
  55. llmflow/config/config_parser.py +0 -80
  56. llmflow/config/mock_config.yaml +0 -58
  57. llmflow/embedding_model/__init__.py +0 -5
  58. llmflow/enumeration/agent_state.py +0 -8
  59. llmflow/llm/__init__.py +0 -5
  60. llmflow/mcp_server.py +0 -110
  61. llmflow/op/__init__.py +0 -10
  62. llmflow/op/base_op.py +0 -125
  63. llmflow/op/mock_op.py +0 -40
  64. llmflow/op/react/react_v1_op.py +0 -88
  65. llmflow/op/react/react_v1_prompt.yaml +0 -28
  66. llmflow/op/vector_store/__init__.py +0 -13
  67. llmflow/op/vector_store/recall_vector_store_op.py +0 -48
  68. llmflow/op/vector_store/update_vector_store_op.py +0 -28
  69. llmflow/op/vector_store/vector_store_action_op.py +0 -46
  70. llmflow/pipeline/pipeline.py +0 -94
  71. llmflow/pipeline/pipeline_context.py +0 -37
  72. llmflow/schema/app_config.py +0 -69
  73. llmflow/schema/experience.py +0 -144
  74. llmflow/schema/message.py +0 -68
  75. llmflow/schema/request.py +0 -32
  76. llmflow/schema/response.py +0 -29
  77. llmflow/service/__init__.py +0 -0
  78. llmflow/service/llmflow_service.py +0 -96
  79. llmflow/tool/__init__.py +0 -9
  80. llmflow/tool/base_tool.py +0 -80
  81. llmflow/tool/code_tool.py +0 -43
  82. llmflow/tool/dashscope_search_tool.py +0 -162
  83. llmflow/tool/mcp_tool.py +0 -77
  84. llmflow/tool/tavily_search_tool.py +0 -109
  85. llmflow/tool/terminate_tool.py +0 -23
  86. llmflow/utils/__init__.py +0 -0
  87. llmflow/utils/common_utils.py +0 -17
  88. llmflow/utils/file_handler.py +0 -25
  89. llmflow/utils/http_client.py +0 -156
  90. llmflow/utils/op_utils.py +0 -102
  91. llmflow/utils/registry.py +0 -33
  92. llmflow/vector_store/__init__.py +0 -7
  93. llmflow/vector_store/base_vector_store.py +0 -136
  94. {llmflow → flowllm/config}/__init__.py +0 -0
  95. {llmflow/config → flowllm/context}/__init__.py +0 -0
  96. {llmflow → flowllm}/enumeration/__init__.py +0 -0
  97. {llmflow → flowllm}/enumeration/chunk_enum.py +0 -0
  98. {llmflow → flowllm}/enumeration/http_enum.py +0 -0
  99. {llmflow → flowllm}/enumeration/role.py +0 -0
  100. {llmflow/op/react → flowllm/op/akshare}/__init__.py +0 -0
  101. {llmflow/pipeline → flowllm/schema}/__init__.py +0 -0
  102. {llmflow → flowllm}/schema/vector_node.py +0 -0
  103. {llmflow/schema → flowllm/utils}/__init__.py +0 -0
  104. {llmflow → flowllm}/utils/singleton.py +0 -0
  105. {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.0
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 Alibaba Group
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
- # LLMFlow
229
+ # flowllm
229
230
 
230
231
  [![Python](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
231
232
  [![License](https://img.shields.io/badge/License-Apache%202.0-green.svg)](https://opensource.org/licenses/Apache-2.0)
232
233
 
233
- LLMFlow 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
+ 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/llmflow.git
278
- cd llmflow
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
- llmflow \
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
- llmflow_mcp \
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
- LLMFlow uses an intuitive string syntax to define operation pipelines:
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
- LLMFlow Service │
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 llmflow.op import OP_REGISTRY
479
- from llmflow.op.base_op import BaseOp
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 llmflow.tool import TOOL_REGISTRY
499
- from llmflow.tool.base_tool import BaseTool
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 llmflow.vector_store import VECTOR_STORE_REGISTRY
522
- from llmflow.vector_store.base_vector_store import BaseVectorStore
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=llmflow tests/
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 llmflow/
569
- isort llmflow/
572
+ black flowllm/
573
+ isort flowllm/
570
574
 
571
575
  # Run type checking
572
- mypy llmflow/
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/llmflow/issues).
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 LLMFlow project.
597
+ Thanks to all developers and community members who have contributed to the flowllm project.
594
598
 
595
599
  ---
596
600
 
597
- **LLMFlow** - Making AI workflow development simple and powerful 🚀
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,,
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+ flowllm = flowllm.app:main
3
+ flowllm_fin = flowllm.app:main
4
+ flowllm_mcp = flowllm.mcp_server:mcp
@@ -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 Alibaba Group
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
@@ -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,3 +0,0 @@
1
- [console_scripts]
2
- llmflow = llmflow.app:main
3
- llmflow_mcp = llmflow.mcp_server:main
@@ -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
@@ -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)
@@ -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
-
@@ -1,5 +0,0 @@
1
- from llmflow.utils.registry import Registry
2
-
3
- EMBEDDING_MODEL_REGISTRY = Registry()
4
-
5
- from llmflow.embedding_model.openai_compatible_embedding_model import OpenAICompatibleEmbeddingModel
@@ -1,8 +0,0 @@
1
- from enum import Enum
2
-
3
-
4
- class AgentState(str, Enum):
5
- IDLE = "idle"
6
- RUNNING = "running"
7
- COMPLETE = "complete"
8
- FAILED = "failed"
llmflow/llm/__init__.py DELETED
@@ -1,5 +0,0 @@
1
- from llmflow.utils.registry import Registry
2
-
3
- LLM_REGISTRY = Registry()
4
-
5
- from llmflow.llm.openai_compatible_llm import OpenAICompatibleBaseLLM
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