flowllm 0.1.1__py3-none-any.whl → 0.1.2__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 (87) hide show
  1. flowllm/__init__.py +15 -6
  2. flowllm/app.py +4 -14
  3. flowllm/client/__init__.py +25 -0
  4. flowllm/client/async_http_client.py +81 -0
  5. flowllm/client/http_client.py +81 -0
  6. flowllm/client/mcp_client.py +133 -0
  7. flowllm/client/sync_mcp_client.py +116 -0
  8. flowllm/config/__init__.py +1 -0
  9. flowllm/config/{default_config.yaml → default.yaml} +3 -8
  10. flowllm/config/empty.yaml +37 -0
  11. flowllm/config/pydantic_config_parser.py +17 -17
  12. flowllm/context/base_context.py +27 -7
  13. flowllm/context/flow_context.py +6 -18
  14. flowllm/context/registry.py +5 -1
  15. flowllm/context/service_context.py +81 -37
  16. flowllm/embedding_model/__init__.py +1 -1
  17. flowllm/embedding_model/base_embedding_model.py +91 -0
  18. flowllm/embedding_model/openai_compatible_embedding_model.py +63 -5
  19. flowllm/flow/__init__.py +1 -0
  20. flowllm/flow/base_flow.py +72 -0
  21. flowllm/flow/base_tool_flow.py +15 -0
  22. flowllm/flow/gallery/__init__.py +8 -0
  23. flowllm/flow/gallery/cmd_flow.py +11 -0
  24. flowllm/flow/gallery/code_tool_flow.py +30 -0
  25. flowllm/flow/gallery/dashscope_search_tool_flow.py +34 -0
  26. flowllm/flow/gallery/deepsearch_tool_flow.py +39 -0
  27. flowllm/flow/gallery/expression_tool_flow.py +18 -0
  28. flowllm/flow/gallery/mock_tool_flow.py +67 -0
  29. flowllm/flow/gallery/tavily_search_tool_flow.py +30 -0
  30. flowllm/flow/gallery/terminate_tool_flow.py +30 -0
  31. flowllm/flow/parser/__init__.py +0 -0
  32. flowllm/{flow_engine/simple_flow_engine.py → flow/parser/expression_parser.py} +25 -67
  33. flowllm/llm/__init__.py +2 -1
  34. flowllm/llm/base_llm.py +94 -4
  35. flowllm/llm/litellm_llm.py +455 -0
  36. flowllm/llm/openai_compatible_llm.py +205 -5
  37. flowllm/op/__init__.py +11 -3
  38. flowllm/op/agent/__init__.py +0 -0
  39. flowllm/op/agent/react_op.py +83 -0
  40. flowllm/op/agent/react_prompt.yaml +28 -0
  41. flowllm/op/akshare/__init__.py +3 -0
  42. flowllm/op/akshare/get_ak_a_code_op.py +14 -22
  43. flowllm/op/akshare/get_ak_a_info_op.py +17 -20
  44. flowllm/op/{llm_base_op.py → base_llm_op.py} +6 -5
  45. flowllm/op/base_op.py +14 -35
  46. flowllm/op/base_ray_op.py +313 -0
  47. flowllm/op/code/__init__.py +1 -0
  48. flowllm/op/code/execute_code_op.py +42 -0
  49. flowllm/op/gallery/__init__.py +2 -0
  50. flowllm/op/{mock_op.py → gallery/mock_op.py} +4 -4
  51. flowllm/op/gallery/terminate_op.py +29 -0
  52. flowllm/op/parallel_op.py +2 -9
  53. flowllm/op/search/__init__.py +3 -0
  54. flowllm/op/search/dashscope_deep_research_op.py +260 -0
  55. flowllm/op/search/dashscope_search_op.py +179 -0
  56. flowllm/op/search/dashscope_search_prompt.yaml +13 -0
  57. flowllm/op/search/tavily_search_op.py +102 -0
  58. flowllm/op/sequential_op.py +1 -9
  59. flowllm/schema/flow_request.py +12 -0
  60. flowllm/schema/service_config.py +12 -16
  61. flowllm/schema/tool_call.py +13 -5
  62. flowllm/schema/vector_node.py +1 -0
  63. flowllm/service/__init__.py +3 -2
  64. flowllm/service/base_service.py +50 -41
  65. flowllm/service/cmd_service.py +15 -0
  66. flowllm/service/http_service.py +34 -42
  67. flowllm/service/mcp_service.py +13 -11
  68. flowllm/storage/cache/__init__.py +1 -0
  69. flowllm/storage/cache/cache_data_handler.py +104 -0
  70. flowllm/{utils/dataframe_cache.py → storage/cache/data_cache.py} +136 -92
  71. flowllm/storage/vector_store/__init__.py +3 -3
  72. flowllm/storage/vector_store/es_vector_store.py +1 -2
  73. flowllm/storage/vector_store/local_vector_store.py +0 -1
  74. flowllm/utils/common_utils.py +9 -21
  75. flowllm/utils/fetch_url.py +16 -12
  76. flowllm/utils/llm_utils.py +28 -0
  77. flowllm/utils/ridge_v2.py +54 -0
  78. {flowllm-0.1.1.dist-info → flowllm-0.1.2.dist-info}/METADATA +43 -390
  79. flowllm-0.1.2.dist-info/RECORD +99 -0
  80. flowllm-0.1.2.dist-info/entry_points.txt +2 -0
  81. flowllm/flow_engine/__init__.py +0 -1
  82. flowllm/flow_engine/base_flow_engine.py +0 -34
  83. flowllm-0.1.1.dist-info/RECORD +0 -62
  84. flowllm-0.1.1.dist-info/entry_points.txt +0 -4
  85. {flowllm-0.1.1.dist-info → flowllm-0.1.2.dist-info}/WHEEL +0 -0
  86. {flowllm-0.1.1.dist-info → flowllm-0.1.2.dist-info}/licenses/LICENSE +0 -0
  87. {flowllm-0.1.1.dist-info → flowllm-0.1.2.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowllm
3
- Version: 0.1.1
4
- Summary: build llm flow
3
+ Version: 0.1.2
4
+ Summary: A flexible framework for building LLM-powered flows and mcp services
5
+ Author-email: FlowLLM Team <flowllm@example.com>
6
+ Maintainer-email: FlowLLM Team <flowllm@example.com>
5
7
  License: Apache License
6
8
  Version 2.0, January 2004
7
9
  http://www.apache.org/licenses/
@@ -204,398 +206,49 @@ License: Apache License
204
206
  See the License for the specific language governing permissions and
205
207
  limitations under the License.
206
208
 
207
- Classifier: Programming Language :: Python :: 3
209
+ Keywords: llm,ai,flow,framework,openai,chatgpt,language-model,mcp,http
210
+ Classifier: Development Status :: 3 - Alpha
211
+ Classifier: Intended Audience :: Developers
212
+ Classifier: Intended Audience :: Science/Research
208
213
  Classifier: License :: OSI Approved :: Apache Software License
209
214
  Classifier: Operating System :: OS Independent
215
+ Classifier: Programming Language :: Python :: 3
216
+ Classifier: Programming Language :: Python :: 3.12
217
+ Classifier: Programming Language :: Python :: 3.13
218
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
219
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
220
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
221
+ Classifier: Typing :: Typed
210
222
  Requires-Python: >=3.12
211
223
  Description-Content-Type: text/markdown
212
224
  License-File: LICENSE
213
- Requires-Dist: dashscope>=1.19.1
214
- Requires-Dist: elasticsearch>=8.14.0
215
- Requires-Dist: fastapi>=0.115.13
216
- Requires-Dist: fastmcp>=2.10.6
217
- Requires-Dist: loguru>=0.7.3
218
- Requires-Dist: mcp>=1.9.4
219
- Requires-Dist: numpy>=2.3.0
220
- Requires-Dist: openai>=1.88.0
221
- Requires-Dist: pydantic>=2.11.7
222
- Requires-Dist: PyYAML>=6.0.2
223
- Requires-Dist: Requests>=2.32.4
224
- Requires-Dist: uvicorn>=0.34.3
225
- Requires-Dist: setuptools>=75.0
226
225
  Requires-Dist: akshare
226
+ Requires-Dist: beautifulsoup4
227
+ Requires-Dist: dashscope
228
+ Requires-Dist: elasticsearch
229
+ Requires-Dist: fastapi
230
+ Requires-Dist: fastmcp
231
+ Requires-Dist: httpx
232
+ Requires-Dist: litellm
233
+ Requires-Dist: loguru
234
+ Requires-Dist: mcp
235
+ Requires-Dist: numpy
236
+ Requires-Dist: openai
237
+ Requires-Dist: pandas
238
+ Requires-Dist: pydantic
239
+ Requires-Dist: PyYAML
240
+ Requires-Dist: ray
241
+ Requires-Dist: requests
242
+ Requires-Dist: scikit-learn
243
+ Requires-Dist: tavily-python
244
+ Requires-Dist: tqdm
245
+ Requires-Dist: urllib3
246
+ Requires-Dist: uvicorn[standard]
247
+ Requires-Dist: chromadb
248
+ Requires-Dist: elasticsearch
249
+ Requires-Dist: ray
250
+ Provides-Extra: distributed
251
+ Requires-Dist: ray; extra == "distributed"
252
+ Provides-Extra: all
253
+ Requires-Dist: flowllm[distributed]; extra == "all"
227
254
  Dynamic: license-file
228
-
229
- # flowllm
230
-
231
- [![Python](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
232
- [![License](https://img.shields.io/badge/License-Apache%202.0-green.svg)](https://opensource.org/licenses/Apache-2.0)
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.
235
-
236
- ## 🚀 Key Features
237
-
238
- ### 🔧 Modular Architecture
239
- - **Pipeline System**: Flexible pipeline configuration supporting both serial and parallel operations
240
- - **Operation Registry**: Extensible operation registry with support for custom operations
241
- - **Configuration-Driven**: Manage entire applications through YAML configuration files
242
-
243
- ### 🤖 LLM Support
244
- - **Multi-Provider Compatible**: Support for OpenAI-compatible APIs
245
- - **Streaming Responses**: Real-time streaming output support
246
- - **Tool Calling**: Built-in tool calling and parallel execution support
247
- - **Reasoning Mode**: Chain-of-thought reasoning support
248
-
249
- ### 📚 Vector Storage
250
- - **Multi-Backend Support**:
251
- - Elasticsearch
252
- - ChromaDB
253
- - Local file storage
254
- - **Embedding Models**: Support for multiple embedding models
255
- - **Workspace Management**: Multi-tenant vector storage management
256
-
257
- ### 🛠️ Rich Tool Ecosystem
258
- - **Code Execution**: Python code execution tool
259
- - **Web Search**: Integrated Tavily and DashScope search
260
- - **MCP Protocol**: Model Context Protocol support
261
- - **Termination Control**: Intelligent conversation termination management
262
-
263
- ### 🌐 API Services
264
- - **RESTful API**: FastAPI-powered HTTP services
265
- - **MCP Server**: Model Context Protocol server support
266
- - **Multiple Endpoints**: Retriever, summarizer, vector store, agent APIs
267
-
268
- ## 📦 Installation
269
-
270
- ### Prerequisites
271
- - Python 3.12+
272
- - pip or poetry
273
-
274
- ### Installation Steps
275
-
276
- ```bash
277
- # Clone the repository
278
- git clone https://github.com/your-username/flowllm.git
279
- cd flowllm
280
-
281
- # Install dependencies
282
- pip install -e .
283
-
284
- # Or using poetry
285
- poetry install
286
- ```
287
-
288
- ### Environment Configuration
289
-
290
- Copy the environment template:
291
- ```bash
292
- cp example.env .env
293
- ```
294
-
295
- Edit the `.env` file to configure necessary API keys:
296
-
297
- ```bash
298
- # LLM Configuration
299
- LLM_API_KEY=sk-your-llm-api-key
300
- LLM_BASE_URL=https://your-llm-endpoint/v1
301
-
302
- # Embedding Model Configuration
303
- EMBEDDING_API_KEY=sk-your-embedding-api-key
304
- EMBEDDING_BASE_URL=https://your-embedding-endpoint/v1
305
-
306
- # Elasticsearch (Optional)
307
- ES_HOSTS=http://localhost:9200
308
-
309
- # DashScope Search (Optional)
310
- DASHSCOPE_API_KEY=sk-your-dashscope-key
311
- ```
312
-
313
- ## 🏃 Quick Start
314
-
315
- ### 1. Start HTTP Service
316
-
317
- ```bash
318
- flowllm \
319
- http_service.port=8001 \
320
- llm.default.model_name=qwen3-32b \
321
- embedding_model.default.model_name=text-embedding-v4 \
322
- vector_store.default.backend=local_file
323
- ```
324
-
325
- ### 2. Start MCP Server
326
-
327
- ```bash
328
- flowllm_mcp \
329
- mcp_transport=stdio \
330
- http_service.port=8001 \
331
- llm.default.model_name=qwen3-32b \
332
- embedding_model.default.model_name=text-embedding-v4 \
333
- vector_store.default.backend=local_file
334
- ```
335
-
336
- ### 3. API Usage Examples
337
-
338
- #### Retriever API
339
- ```python
340
- import requests
341
-
342
- response = requests.post('http://localhost:8001/retriever', json={
343
- "query": "What is artificial intelligence?",
344
- "top_k": 5,
345
- "workspace_id": "default",
346
- "config": {}
347
- })
348
- print(response.json())
349
- ```
350
-
351
- #### Agent API
352
- ```python
353
- response = requests.post('http://localhost:8001/agent', json={
354
- "query": "Help me search for the latest AI technology trends",
355
- "workspace_id": "default",
356
- "config": {}
357
- })
358
- print(response.json())
359
- ```
360
-
361
- ## ⚙️ Configuration Guide
362
-
363
- ### Pipeline Configuration Syntax
364
-
365
- flowllm uses an intuitive string syntax to define operation pipelines:
366
-
367
- ```yaml
368
- api:
369
- # Serial execution: op1 -> op2 -> op3
370
- retriever: recall_vector_store_op->summarizer_op
371
-
372
- # Parallel execution: [op1 | op2] runs in parallel
373
- summarizer: mock1_op->[mock4_op->mock2_op|mock5_op]->mock3_op
374
-
375
- # Mixed mode: combination of serial and parallel
376
- agent: react_v1_op
377
- ```
378
-
379
- ### Complete Configuration Example
380
-
381
- ```yaml
382
- # HTTP Service Configuration
383
- http_service:
384
- host: "0.0.0.0"
385
- port: 8001
386
- timeout_keep_alive: 600
387
- limit_concurrency: 64
388
-
389
- # Thread Pool Configuration
390
- thread_pool:
391
- max_workers: 10
392
-
393
- # API Pipeline Definitions
394
- api:
395
- retriever: recall_vector_store_op
396
- summarizer: update_vector_store_op
397
- vector_store: vector_store_action_op
398
- agent: react_v1_op
399
-
400
- # Operation Configuration
401
- op:
402
- react_v1_op:
403
- backend: react_v1_op
404
- llm: default
405
- params:
406
- max_steps: 10
407
- tool_names: "code_tool,tavily_search_tool,terminate_tool"
408
-
409
- # LLM Configuration
410
- llm:
411
- default:
412
- backend: openai_compatible
413
- model_name: qwen3-32b
414
- params:
415
- temperature: 0.6
416
- max_retries: 5
417
-
418
- # Embedding Model Configuration
419
- embedding_model:
420
- default:
421
- backend: openai_compatible
422
- model_name: text-embedding-v4
423
- params:
424
- dimensions: 1024
425
-
426
- # Vector Store Configuration
427
- vector_store:
428
- default:
429
- backend: local_file # or elasticsearch, chroma
430
- embedding_model: default
431
- params:
432
- store_dir: "./vector_store_data"
433
- ```
434
-
435
- ## 🧩 Architecture Design
436
-
437
- ### Core Components
438
-
439
- ```
440
- ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
441
- │ FastAPI App │ │ MCP Server │ │ Configuration │
442
- │ │ │ │ │ Parser │
443
- └─────────────────┘ └─────────────────┘ └─────────────────┘
444
- │ │ │
445
- └───────────────────────┼───────────────────────┘
446
-
447
- ┌─────────────────┐
448
- │ flowllm Service │
449
- └─────────────────┘
450
-
451
- ┌─────────────────┐
452
- │ Pipeline │
453
- │ Context │
454
- └─────────────────┘
455
-
456
- ┌───────────────────┼───────────────────┐
457
- │ │ │
458
- ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
459
- │ Operations │ │ Tools │ │Vector Stores│
460
- │ │ │ │ │ │
461
- │ • ReAct │ │ • Code │ │ • File │
462
- │ • Recall │ │ • Search │ │ • ES │
463
- │ • Update │ │ • MCP │ │ • Chroma │
464
- │ • Mock │ │ • Terminate │ │ │
465
- └─────────────┘ └─────────────┘ └─────────────┘
466
- ```
467
-
468
- ### Data Flow
469
-
470
- ```
471
- Request → Configuration → Pipeline → Operations → Tools/VectorStore → Response
472
- ```
473
-
474
- ## 🔧 Development Guide
475
-
476
- ### Custom Operations
477
-
478
- ```python
479
- from old.op import OP_REGISTRY
480
- from old.op.base_op import BaseOp
481
-
482
-
483
- @OP_REGISTRY.register()
484
- class CustomOp(BaseOp):
485
- def execute(self):
486
- # Implement your custom logic
487
- request = self.context.request
488
- response = self.context.response
489
-
490
- # Process request
491
- result = self.process_data(request.query)
492
-
493
- # Update response
494
- response.metadata["custom_result"] = result
495
- ```
496
-
497
- ### Custom Tools
498
-
499
- ```python
500
- from old.tool import TOOL_REGISTRY
501
- from old.tool.base_tool import BaseTool
502
-
503
-
504
- @TOOL_REGISTRY.register()
505
- class CustomTool(BaseTool):
506
- name: str = "custom_tool"
507
- description: str = "Custom tool description"
508
- parameters: dict = {
509
- "type": "object",
510
- "properties": {
511
- "input": {"type": "string", "description": "Input parameter"}
512
- },
513
- "required": ["input"]
514
- }
515
-
516
- def _execute(self, input: str, **kwargs):
517
- # Implement tool logic
518
- return f"Processing result: {input}"
519
- ```
520
-
521
- ### Custom Vector Stores
522
-
523
- ```python
524
- from old.vector_store import VECTOR_STORE_REGISTRY
525
- from old.vector_store.base_vector_store import BaseVectorStore
526
-
527
-
528
- @VECTOR_STORE_REGISTRY.register("custom_store")
529
- class CustomVectorStore(BaseVectorStore):
530
- def search(self, query: str, top_k: int = 10, **kwargs):
531
- # Implement search logic
532
- pass
533
-
534
- def insert(self, nodes: List[VectorNode], **kwargs):
535
- # Implement insertion logic
536
- pass
537
- ```
538
-
539
- ## 🧪 Testing
540
-
541
- ```bash
542
- # Run tests
543
- pytest
544
-
545
- # Run specific tests
546
- pytest tests/test_pipeline.py
547
-
548
- # Generate coverage report
549
- pytest --cov=flowllm tests/
550
- ```
551
-
552
- ## 🤝 Contributing
553
-
554
- We welcome community contributions! Please follow these steps:
555
-
556
- 1. Fork the repository
557
- 2. Create a feature branch (`git checkout -b feature/AmazingFeature`)
558
- 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
559
- 4. Push to the branch (`git push origin feature/AmazingFeature`)
560
- 5. Open a Pull Request
561
-
562
- ### Development Environment Setup
563
-
564
- ```bash
565
- # Install development dependencies
566
- pip install -e ".[dev]"
567
-
568
- # Install pre-commit hooks
569
- pre-commit install
570
-
571
- # Run code formatting
572
- black flowllm/
573
- isort flowllm/
574
-
575
- # Run type checking
576
- mypy flowllm/
577
- ```
578
-
579
- ## 📚 Documentation
580
-
581
- - [API Documentation](docs/api.md)
582
- - [Configuration Guide](docs/configuration.md)
583
- - [Operations Development](docs/operations.md)
584
- - [Tools Development](docs/tools.md)
585
- - [Deployment Guide](docs/deployment.md)
586
-
587
- ## 🐛 Bug Reports
588
-
589
- If you find bugs or have feature requests, please create an issue on [GitHub Issues](https://github.com/your-username/flowllm/issues).
590
-
591
- ## 📄 License
592
-
593
- This project is licensed under the Apache License 2.0. See the [LICENSE](LICENSE) file for details.
594
-
595
- ## 🙏 Acknowledgments
596
-
597
- Thanks to all developers and community members who have contributed to the flowllm project.
598
-
599
- ---
600
-
601
- **flowllm** - Making AI workflow development simple and powerful 🚀
@@ -0,0 +1,99 @@
1
+ flowllm/__init__.py,sha256=8BSQq5dCwf6h773C8ctRCfqElhRi26NOxcNvc7MlW7g,436
2
+ flowllm/app.py,sha256=oo_7c1sXeWOEkdIL40b_Yv-vkvu6YWhs3w49SojE4bs,238
3
+ flowllm/client/__init__.py,sha256=ruBU6hBC7LWoVg5oNdZBTqi3MhNUhkCYAHhPj-UJKEA,815
4
+ flowllm/client/async_http_client.py,sha256=w3YUsCTlART3HvAIpf30ZIX4m7L7k9f9iZejkNBq_h8,3026
5
+ flowllm/client/http_client.py,sha256=rk6-hF3lqwn8a2igQjBuRz7JOV9lJJrNYlC7Xk18Zwo,2930
6
+ flowllm/client/mcp_client.py,sha256=dFJvHqqVpUv7icIUNKdJpfQI1FXx3zF76Lgnbyyp8Go,4867
7
+ flowllm/client/sync_mcp_client.py,sha256=Csv5hwlPDDCktM9qqLqdQkSG039ooiSurN5DMcJfrq8,4305
8
+ flowllm/config/__init__.py,sha256=fUjhShdU7qN6hfj7blDt7nHBQGlWwbhaa_p9_6vDpg8,57
9
+ flowllm/config/default.yaml,sha256=aMbEVThmwd7T-d9s3ovj8ljcIj-rNTMSJjGunXZQ3Vo,2015
10
+ flowllm/config/empty.yaml,sha256=Ysnu12YDBo9fJ2F6ha2rhEgDiUD7KbkqNYZ2TVk28V8,625
11
+ flowllm/config/pydantic_config_parser.py,sha256=J6o0NwimyLTMhKmSkmlNXv71JngzgupY9EFuBzqr7ts,6942
12
+ flowllm/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ flowllm/context/base_context.py,sha256=NTP6EzfIlcjvwT5-wYDL5_gDoH88rAxTqsknR97txYg,2227
14
+ flowllm/context/flow_context.py,sha256=-r96PgXC7BXVjA6bbUKw_cI5r3VRgQJ0AqG3iES4xSw,463
15
+ flowllm/context/prompt_handler.py,sha256=LbMJDwrzz8HF7HVDyphVSWI1X4QHMebJqLP4XeXkXOE,2667
16
+ flowllm/context/registry.py,sha256=zJf8SYi8ziFTdf2EG9Ut2_3sxEffchrl81W-VbcoEns,1110
17
+ flowllm/context/service_context.py,sha256=PnLiH1AwcYxpg6YAsVin2y82QDvbYmt8eg8qsJom3cw,5786
18
+ flowllm/embedding_model/__init__.py,sha256=jHxnI2xySqYcu7Y2wxmlmpIyYeKH_4PuNCBNvouXhEE,78
19
+ flowllm/embedding_model/base_embedding_model.py,sha256=oIySUu6_ROEXw13jtKYUtnL0bgBQdHtNZqnPPxatG9I,8021
20
+ flowllm/embedding_model/openai_compatible_embedding_model.py,sha256=N873ZlMdoB6iRu-oXkXlNNkIdH6F4hFN3ND7EA0FcwA,5490
21
+ flowllm/enumeration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ flowllm/enumeration/chunk_enum.py,sha256=EYB0a84qtrph5H7h_m05Qeo5B00B3xnSOt9KBb5CCJY,152
23
+ flowllm/enumeration/http_enum.py,sha256=ddIYeVz2J8CInzEkhWbz1rPe0qh2FVfryNNE1uc1ioM,141
24
+ flowllm/enumeration/role.py,sha256=SFMGXmwYFndGIwbr9GxS3OIoHIZ_nO23DeRnqpV4U3g,133
25
+ flowllm/flow/__init__.py,sha256=m2SCRH8CbDGsYXaUn99FGD9bz5KoDpLAcFu1GXu3GCo,22
26
+ flowllm/flow/base_flow.py,sha256=wngyIzkKMbv_tI_kSGnQuoU1kiC7KKvGz3t2R-ziyMk,2445
27
+ flowllm/flow/base_tool_flow.py,sha256=eC-V9kafecsXJixqXGfmD1DF70tA8ClM2f4rnW2K1vU,368
28
+ flowllm/flow/gallery/__init__.py,sha256=fT1aFrcw-QvFkEnPkOXHMZNK9IDapH0U_iEfwRbq7oI,391
29
+ flowllm/flow/gallery/cmd_flow.py,sha256=nqwMufrJWsJLmNaIVwJ6M11Hnxfpl1FvW07EC95qzN0,337
30
+ flowllm/flow/gallery/code_tool_flow.py,sha256=s-97BHplWO4Me4eTPNDltZL7XcGIAsz8IBL86mMoiVk,1075
31
+ flowllm/flow/gallery/dashscope_search_tool_flow.py,sha256=RxyWNQ-h0tt7236H7fAURqDEKNvccI5jGQA07TAKbLg,1153
32
+ flowllm/flow/gallery/deepsearch_tool_flow.py,sha256=_3JUiNivDGZxo-i1zHtX3MPMuqJSZXEZ2A2Mm_IUIY8,1426
33
+ flowllm/flow/gallery/expression_tool_flow.py,sha256=U0s9znCPSFwuqc7SalidjDGI-0kr9KGK3fWEQCN_q58,665
34
+ flowllm/flow/gallery/mock_tool_flow.py,sha256=InDQnMgHKUoiMbpUQ4Fa7HJaQ6TczbFjvZ7R2onZycE,2424
35
+ flowllm/flow/gallery/tavily_search_tool_flow.py,sha256=DJeHx-ry4cAOaVsRy28Kob3ecwnq41bsAo0gTmokArE,1046
36
+ flowllm/flow/gallery/terminate_tool_flow.py,sha256=6BgJE81ODLXXvc6GH6n1_twh5O052zHB62PEGm7OtH8,1103
37
+ flowllm/flow/parser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ flowllm/flow/parser/expression_parser.py,sha256=E8ZGmrdFpOgUQBtXxtVXb-BD7RUtfLkcWsIQBKTqdcA,5990
39
+ flowllm/llm/__init__.py,sha256=c2akU1k4IVT6PoW3FdKlFmQNZj7MVCzV_VTUw5VpDrc,99
40
+ flowllm/llm/base_llm.py,sha256=6YDlb9B9q4zQGQjFLVKNdd7JoELws9IzHebs2nDfUzc,9554
41
+ flowllm/llm/litellm_llm.py,sha256=EcgPMUo3i9TJ440bVwHzMQC8zuzSoYVdRdsr94jFziA,19387
42
+ flowllm/llm/openai_compatible_llm.py,sha256=MKbe4-p4NkCBCCkrty0mFsBTRpXctI-7rz0-2kzvNQo,18534
43
+ flowllm/op/__init__.py,sha256=4tRRZGMB3g_ketMW9Tk3fUcxkGAmNjmzfZWHeF4Jfbg,201
44
+ flowllm/op/base_llm_op.py,sha256=vDbXuhv1s94FmRCk6W55Y5A1qrJMCoT6LyfZjUwJykA,2669
45
+ flowllm/op/base_op.py,sha256=F-wdUwYfFWr-UJXJDN9qxI7B87ETfGidPvbakziYs3U,4147
46
+ flowllm/op/base_ray_op.py,sha256=-nRbad0pQ4qkZaDbonBDf6qh_dzktzOTCc-XkiLiIT4,11238
47
+ flowllm/op/parallel_op.py,sha256=Q66uB-uINsBj_m6NH140kiQPN1o9aw-wkc_5y74EaRY,551
48
+ flowllm/op/sequential_op.py,sha256=F8YTNCvPL0WsC_6Al9utnCErGnnnsEpaw4MVeUX3Skk,477
49
+ flowllm/op/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ flowllm/op/agent/react_op.py,sha256=2pL19P3cD-pUjimCBWUhdVE_B6dxcjLH3empU12L5IA,3683
51
+ flowllm/op/agent/react_prompt.yaml,sha256=XL8NLutlT5cuJAbWxw1Acu4NKuBoHx5h9iXVr-c30js,1552
52
+ flowllm/op/akshare/__init__.py,sha256=PaCPzBv-csRgmtmBjoYqxvOgAB3Vp8EeSGP3rGw6rc8,178
53
+ flowllm/op/akshare/get_ak_a_code_op.py,sha256=Pa766YbR_SPLHbQZQpW0UBBUBcXqigeEj10ypp3V3K4,3855
54
+ flowllm/op/akshare/get_ak_a_code_prompt.yaml,sha256=NwGJygecUwspQvrg98GdMpcmQESpZ2Kf5YprhM2PyZU,608
55
+ flowllm/op/akshare/get_ak_a_info_op.py,sha256=R0O4Ze_1oNjNIREJd6SoANWewrAnasg8R033lbqF81o,4497
56
+ flowllm/op/code/__init__.py,sha256=5lV5jHJ-qTdyf5yprrgWZTmu5n68T2gXFByhTIMI_I0,43
57
+ flowllm/op/code/execute_code_op.py,sha256=y6_CkllKJpxPqD0c6IVcbluK9RK8lCKifDIoCHqFHdE,1114
58
+ flowllm/op/gallery/__init__.py,sha256=5S2pzO65wOpE7PnirS6FiBN1uEm49Y40PZiW9EnGMn0,112
59
+ flowllm/op/gallery/mock_op.py,sha256=3GfqtOQm87A9TmZTD5Z4jcAxqPbtvmNQA7qTFcp897E,664
60
+ flowllm/op/gallery/terminate_op.py,sha256=dHiXONYDXkhePsmzAMa8FRktodZroB_G-UXApTNME3w,866
61
+ flowllm/op/search/__init__.py,sha256=iCxX7lBOWmgBM-xiLUN3SAB3LtYiS4Dk9ZEew-vlIBM,160
62
+ flowllm/op/search/dashscope_deep_research_op.py,sha256=FjWsk7UIIj6P3rqgcl9Nvo7BhIJGHHcOF4F-AltfZfo,11498
63
+ flowllm/op/search/dashscope_search_op.py,sha256=qlCOZLNlb8K4VCfOyrcQ21iNPojVPBujOWgKcNbzcEA,6931
64
+ flowllm/op/search/dashscope_search_prompt.yaml,sha256=NPsS3QCo8xlRpWw7fyMpuYBeOXSAtXscwGO-cVgUNFw,355
65
+ flowllm/op/search/tavily_search_op.py,sha256=F9gD0rLRo5sTvoeSP8CW2nqoAyDLNJjBYNU5-eH98z8,3814
66
+ flowllm/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
+ flowllm/schema/flow_request.py,sha256=jaOgEJ7XRWNgS_QTCBOOsa6hKtdgqnXVC7S4Vi6lMBg,338
68
+ flowllm/schema/flow_response.py,sha256=BusrfkJ8OCGk9Tp1KCWVSt33L2t_pYpn9QRqS0bjDcw,323
69
+ flowllm/schema/message.py,sha256=yxbKvH7TRECozUYdm141q84QGoqyOe3krSXgzWRdWHs,1220
70
+ flowllm/schema/service_config.py,sha256=Gaw-EKuwc7kmdR1yaVN04qruaESeUSguivK4JUfCPBQ,2324
71
+ flowllm/schema/tool_call.py,sha256=lz8x5hVuF2w05QHscgWmWuyfvU_FVxp7Ut0_L8oy1ig,3959
72
+ flowllm/schema/vector_node.py,sha256=Urs9EyzzjuQVYPCB_Pfp0iK2npWWCJSXdT6uDLdT05w,362
73
+ flowllm/service/__init__.py,sha256=Jr-f0i1yCIoM4XZ3SbOcqMU81Np3YgNZs6z36YfUpzQ,110
74
+ flowllm/service/base_service.py,sha256=6KJnIVkaIBNHwtQY83LmEMoTiMK5qI0ZtNMmIVjEZ5E,2335
75
+ flowllm/service/cmd_service.py,sha256=TfN2TLVNR75jUcAgjeOkxsA7ORCkERvRkuCE3Get7f0,464
76
+ flowllm/service/http_service.py,sha256=Kidb-J6FYpAtKhdH2pawFwPnrBTSEuwmT8iK6nMd2cQ,2807
77
+ flowllm/service/mcp_service.py,sha256=DR116-EeFBI_Sqbxu0X2NJ1e4cD8-T6kTYzPEPYsCuY,1889
78
+ flowllm/storage/__init__.py,sha256=wlGDDqp6nM4TLoEAXtSglgB0-K2YHAq_DNnsHTBQj8s,41
79
+ flowllm/storage/cache/__init__.py,sha256=KyLfUg3gJ4SvHMRagtZDL8cp5s5SRsN9H-_y4uRf2II,34
80
+ flowllm/storage/cache/cache_data_handler.py,sha256=fNnVwKOTOL3fZfukIN2gy3txlxiwr3CR9t3tVnIusvw,2700
81
+ flowllm/storage/cache/data_cache.py,sha256=cVz20JUkGgXzB5YgZiyeiBYpA0nRFyBtxhgVVQkFeA4,12144
82
+ flowllm/storage/vector_store/__init__.py,sha256=0DH2mkNiQ_cB5yPzm2Xc-7qsFHz1ytMkGUptWGZkyuU,143
83
+ flowllm/storage/vector_store/base_vector_store.py,sha256=V5b3kux6rJROjyMZzzHu_09ornvO_zZzcPgzZFF8Hv0,1635
84
+ flowllm/storage/vector_store/chroma_vector_store.py,sha256=BHcfhMBBDaoQOywfhYgp87v6OjTf0ePyTI2h-MWQywc,7067
85
+ flowllm/storage/vector_store/es_vector_store.py,sha256=Idkj2IVnXBc6Hbqs6A76LbiP-1pMZbWSECYogWy27Do,8452
86
+ flowllm/storage/vector_store/local_vector_store.py,sha256=p8xg2cmv17bm1UYXZBhLMAGulOE8v70Iw4oTM0Ls61s,10396
87
+ flowllm/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
+ flowllm/utils/common_utils.py,sha256=v9vTK_FrOsyXNZN2-CRJ6zLrCqaSX0-LNpt6IFt6sNg,1232
89
+ flowllm/utils/fetch_url.py,sha256=pOYiliL4kTGQKERCHrFhammBsbv9XzSvVyBQDMgXKEY,4404
90
+ flowllm/utils/llm_utils.py,sha256=ywhf1LGe2aKEaL5PyOpoOAbiekrQVOcpxUJ4ARPioQQ,1121
91
+ flowllm/utils/ridge_v2.py,sha256=XIn6nu4jUV7_QUCeyhSEhm-4ltueaS7JdbDQmSQFnRE,1802
92
+ flowllm/utils/singleton.py,sha256=No3otyPDRHu6wQuFRC-w28MkbommVFTLd7H4mT6-Zos,213
93
+ flowllm/utils/timer.py,sha256=8aj3dIYOyxNDNdlcitezdepxEptqkx69aw6JNFWsr30,1492
94
+ flowllm-0.1.2.dist-info/licenses/LICENSE,sha256=kFfPsL7YvEW4jPATpyvUPdtEgftLK53zQrVYJ0eBASY,11337
95
+ flowllm-0.1.2.dist-info/METADATA,sha256=cMEQ5Agae0ktU38cIPqBJfBN5OAVKN2WS6gRrsN8ehg,14756
96
+ flowllm-0.1.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
97
+ flowllm-0.1.2.dist-info/entry_points.txt,sha256=PcKC61HCKtF4ONb4HnrIY6J2JeV1bsi_l0O2m99A2Wg,45
98
+ flowllm-0.1.2.dist-info/top_level.txt,sha256=a2tZBwbrnw4uiydMI5kAEGz-cxG25rf6v0QM1sYIrjs,8
99
+ flowllm-0.1.2.dist-info/RECORD,,
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ flowllm = flowllm.app:main
@@ -1 +0,0 @@
1
- from flowllm.flow_engine import simple_flow_engine
@@ -1,34 +0,0 @@
1
- from abc import ABC
2
- from typing import Optional
3
-
4
- from flowllm.context.flow_context import FlowContext
5
- from flowllm.op.base_op import BaseOp
6
- from flowllm.utils.timer import timer
7
-
8
-
9
- class BaseFlowEngine(ABC):
10
-
11
- def __init__(self, flow_name: str, flow_content: str, flow_context: FlowContext):
12
- self.flow_name: str = flow_name
13
- self.flow_content: str = flow_content
14
- self.flow_context: FlowContext = flow_context
15
-
16
- self._parsed_flow: Optional[BaseOp] = None
17
- self._parsed_ops_cache = {}
18
-
19
- def _parse_flow(self):
20
- raise NotImplementedError
21
-
22
- def _create_op(self, op_name: str):
23
- raise NotImplementedError
24
-
25
- def _print_flow(self):
26
- raise NotImplementedError
27
-
28
- def _execute_flow(self):
29
- raise NotImplementedError
30
-
31
- def __call__(self):
32
- self._parse_flow()
33
- self._print_flow()
34
- return self._execute_flow()
@@ -1,62 +0,0 @@
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,,
@@ -1,4 +0,0 @@
1
- [console_scripts]
2
- flowllm = flowllm.app:main
3
- flowllm_fin = flowllm.app:main
4
- flowllm_mcp = flowllm.mcp_server:mcp