From 15af067bae0446b2660d985c5e284d89ff0e6f88 Mon Sep 17 00:00:00 2001 From: vizsatiz Date: Sat, 15 Nov 2025 14:55:51 +0530 Subject: [PATCH 01/29] middleware --- README.md | 691 +++++++++++------------------------------------ flo_ai/README.md | 4 +- 2 files changed, 158 insertions(+), 537 deletions(-) diff --git a/README.md b/README.md index f28f4ce1..1930721e 100644 --- a/README.md +++ b/README.md @@ -2,22 +2,23 @@ Rootflo

-

Flo AI 🌊

+

Wavefront AI

-

- Build production-ready AI agents with structured outputs, tool integration, and multi-LLM support +

+ Enterprise AI Middleware For Building Production Ready Full Stack Applications +

Open source alternative to UnifyApps, LyzrAI, SuperAGI & AgentGPT

+

Built using flo-ai

- GitHub stars + GitHub stars - GitHub release (latest) + GitHub release (latest) - GitHub commit activity + GitHub commit activity - License - Tests Passing + Tests Passing

@@ -33,572 +34,192 @@
-## 🚀 What is Flo AI? - -Flo AI is a Python framework that makes building production-ready AI agents and teams as easy as writing YAML. Think "Kubernetes for AI Agents" - compose complex AI architectures using pre-built components while maintaining the flexibility to create your own. - -### ✨ Key Features - -- 🔌 **Truly Composable**: Build complex AI systems by combining smaller, reusable components -- 🏗️ **Production-Ready**: Built-in best practices and optimizations for production deployments -- 📝 **YAML-First**: Define your entire agent architecture in simple YAML -- 🧠 **LLM-Powered Routing**: Intelligent routing decisions made by LLMs, no code required -- 🔧 **Flexible**: Use pre-built components or create your own -- 🤝 **Team-Oriented**: Create and manage teams of AI agents working together -- 📊 **OpenTelemetry Integration**: Built-in observability with automatic instrumentation - -## 📖 Table of Contents - -- [🚀 Quick Start](#-quick-start) - - [Installation](#installation) - - [Your First Agent (30 seconds)](#your-first-agent-30-seconds) - - [Tool-Using Agent](#tool-using-agent) - - [Structured Output Agent](#structured-output-agent) -- [🎨 Flo AI Studio - Visual Workflow Designer](#-flo-ai-studio---visual-workflow-designer) -- [🔧 Core Features](#-core-features) - - [LLM Providers](#llm-providers) - - [Tools & @flo_tool Decorator](#tools--flo_tool-decorator) - - [Variables System](#variables-system) - - [Document Processing](#document-processing) - - [Output Formatting](#output-formatting) - - [Error Handling](#error-handling) -- [🔄 Agent Orchestration with Arium](#-agent-orchestration-with-arium) - - [Simple Agent Chains](#simple-agent-chains) - - [Conditional Routing](#conditional-routing) - - [YAML-Based Workflows](#yaml-based-workflows) - - [LLM-Powered Routers](#llm-powered-routers) - - [ReflectionRouter & PlanExecuteRouter](#reflectionrouter--planexecuterouter) -- [📊 OpenTelemetry Integration](#-opentelemetry-integration) -- [📚 Examples & Documentation](#-examples--documentation) -- [🌟 Why Flo AI?](#-why-flo-ai) -- [🤝 Contributing](#-contributing) - -## 🚀 Quick Start - -### Installation - -```bash -pip install flo-ai -# or using poetry -poetry add flo-ai -# or using uv -uv add flo-ai -``` - -### Your First Agent (30 seconds) - -```python -import asyncio -from flo_ai.builder.agent_builder import AgentBuilder -from flo_ai.llm import OpenAI - -async def main(): - # Create a simple conversational agent - agent = ( - AgentBuilder() - .with_name('Math Tutor') - .with_prompt('You are a helpful math tutor.') - .with_llm(OpenAI(model='gpt-4o-mini')) - .build() - ) - - response = await agent.run('What is the formula for the area of a circle?') - print(f'Response: {response}') - -asyncio.run(main()) -``` - -### Tool-Using Agent - -```python -import asyncio -from flo_ai.builder.agent_builder import AgentBuilder -from flo_ai.tool import flo_tool -from flo_ai.llm import Anthropic - -@flo_tool(description="Perform mathematical calculations") -async def calculate(operation: str, x: float, y: float) -> float: - """Calculate mathematical operations between two numbers.""" - operations = { - 'add': lambda: x + y, - 'subtract': lambda: x - y, - 'multiply': lambda: x * y, - 'divide': lambda: x / y if y != 0 else 0, - } - return operations.get(operation, lambda: 0)() - -async def main(): - agent = ( - AgentBuilder() - .with_name('Calculator Assistant') - .with_prompt('You are a math assistant that can perform calculations.') - .with_llm(Anthropic(model='claude-3-5-sonnet-20240620')) - .with_tools([calculate.tool]) - .build() -) - - response = await agent.run('Calculate 5 plus 3') - print(f'Response: {response}') - -asyncio.run(main()) -``` - -### Structured Output Agent - -```python -import asyncio -from pydantic import BaseModel, Field -from flo_ai.builder.agent_builder import AgentBuilder -from flo_ai.llm import OpenAI - -class MathSolution(BaseModel): - solution: str = Field(description="Step-by-step solution") - answer: str = Field(description="Final answer") - confidence: float = Field(description="Confidence level (0-1)") - -async def main(): - agent = ( - AgentBuilder() - .with_name('Math Solver') - .with_llm(OpenAI(model='gpt-4o')) - .with_output_schema(MathSolution) - .build() -) - - response = await agent.run('Solve: 2x + 5 = 15') - print(f'Structured Response: {response}') - -asyncio.run(main()) -``` - -## 🎨 Flo AI Studio - Visual Workflow Designer - -**Create AI workflows visually with our powerful React-based studio!** - -

- Flo AI Studio - Visual Workflow Designer -

- -Flo AI Studio is a modern, intuitive visual editor that allows you to design complex multi-agent workflows through a drag-and-drop interface. Build sophisticated AI systems without writing code, then export them as production-ready YAML configurations. +# 🚀 Wavefront AI Middleware -### 🚀 Studio Features +Wavefront AI is an open-source middleware platform designed to seamlessly integrate AI-driven agents, workflows, and data sources across enterprise environments. It acts as a connective layer that bridges modular frontend applications with complex backend data pipelines, ensuring secure access, observability, and compatibility with modern AI and data infrastructures. -- **🎯 Visual Design**: Drag-and-drop interface for creating agent workflows -- **🤖 Agent Management**: Configure AI agents with different roles, models, and tools -- **🔀 Smart Routing**: Visual router configuration for intelligent workflow decisions -- **📤 YAML Export**: Export workflows as Flo AI-compatible YAML configurations -- **📥 YAML Import**: Import existing workflows for further editing -- **✅ Workflow Validation**: Real-time validation and error checking -- **🔧 Tool Integration**: Connect agents to external tools and APIs -- **📋 Template System**: Quick start with pre-built agent and router templates +**Status**: Pre-release (Open sourcing coming soon) +**License**: [Apache 2.0] +**Contributing**: We welcome early feedback! See [CONTRIBUTING.md](CONTRIBUTING.md) -### 🏃‍♂️ Quick Start with Studio - -1. **Start the Studio**: +--- - ```bash - cd studio - pnpm install - pnpm dev - ``` +## ✨ Key Capabilities -2. **Design Your Workflow**: +- **🎯 Modular AI Application Integration** + Deploy diverse AI agents for auditing, underwriting, contact center supervision, and business process automation without rebuilding infrastructure. - - Add agents, routers, and tools to the canvas - - Configure their properties and connections - - Test with the built-in validation +- **🔌 Unified SDK and API Layer** + Standardized APIs for developing, deploying, and managing AI workflows across multiple use cases and frameworks. -3. **Export & Run**: +- **🔐 Enterprise-Grade Authentication & Authorization** + Native integrations with Google Auth, LDAP, Auth0, Okta, and Microsoft AD/Entra for seamless SSO and access controls. -```python -from flo_ai.arium import AriumBuilder +- **🌐 Comprehensive Data Connectivity** + Ingest data from OLAP/OLTP systems (BigQuery, Redshift), HDFS, cloud storage (S3, GCS), databases (PostgreSQL, MongoDB), and enterprise APIs (Salesforce, SAP). - builder = AriumBuilder.from_yaml(yaml_file='your_workflow.yaml') - result = await builder.build_and_run(['Your input here']) -``` +- **👥 Granular Role-Based Access Control** + Fine-grained permissions for both AI agents and data sources, ensuring compliance and least-privilege access. -## 🔧 Core Features +- **🤖 Open Source & Proprietary Model Support** + Works seamlessly with open-source LLMs/SLMs, custom models, and proprietary AI services. -### LLM Providers +- **📊 Observability, Monitoring & Evaluation** + Built-in telemetry with Grafana and Prometheus support. Track agent performance, audit trails, and guardrail enforcement in real-time. -Flo AI supports multiple LLM providers with consistent interfaces: +- **🤖 No Code Agent & Workflow Builder** + Built-in capabilities to build and customer AI agents, and AI Workflows, connecting Data Sources, Knowledge Bases, in minutes -```python -# OpenAI -from flo_ai.llm import OpenAI -llm = OpenAI(model='gpt-4o', temperature=0.7) +- **🔊 Voice & Conversational Agents** + Integrated Voice-to-Voice Bots, ASR models, and agentic flows for contact center and conversational use cases. -# Anthropic Claude -from flo_ai.llm import Anthropic -llm = Anthropic(model='claude-3-5-sonnet-20240620', temperature=0.7) +- **🧠 Knowledge Bases & RAG Ready** + Native support for Retrieval-Augmented Generation with MCP connectors and external knowledge bases. -# Google Gemini -from flo_ai.llm import Gemini -llm = Gemini(model='gemini-2.5-flash', temperature=0.7) +--- -# Google VertexAI -from flo_ai.llm import VertexAI -llm = VertexAI(model='gemini-2.5-flash', project='your-project') +## 🏗️ Architecture Overview -# Ollama (Local) -from flo_ai.llm import Ollama -llm = Ollama(model='llama2', base_url='http://localhost:11434') -``` +

+ Rootflo +

-### Tools & @flo_tool Decorator +### Layer Descriptions + +| Layer | Purpose | Components | +|-------|---------|------------| +| **Frontend Applications** | User-facing AI interfaces | Supervisors, Audit Agents, Underwriters, Copilots | +| **SDK & API Layer** | Standardized communication | Frontend SDK, REST/GraphQL APIs | +| **Authentication** | Identity verification & SSO | Google Auth, LDAP, Auth0, Okta, Microsoft AD | +| **Authorization (Agents)** | Agent-level access policies | Role definitions, permission mapping | +| **AI Workflows** | Intelligent automation | Agentic flows, Voice agents, LLM integrations, RAG | +| **Data Processing** | ETL and API management | Pipelines, transformations, HTTP endpoints | +| **Authorization (Data)** | Data source access control | Fine-grained permissions, audit logging | +| **Data Sources** | Enterprise data systems | Databases, APIs, Cloud storage, Data warehouses | + +## Platform Components + +As part of the project, we plan to develop and open source the following major components. + +- [FloAI](https://github.com/rootflo/flo-ai/tree/develop/flo_ai) library for Agent Building & A2A Orchestraction +- **Wavefront Core** Middleware Service +- **Wavefront Control Panel** Unified frontend for configuring agents, workflows, AI models, Gaurdrails, RBAC etc. +- **Wavefront cli** for configuring through cli + +## 🛣️ Current Support & Roadmap + +### Data Adapters + +| Adapter | Status | Notes | +|---------|--------|-------| +| BigQuery | ✅ Available | Full read/write support | +| Redshift | ✅ Available | Production-ready | +| PostgreSQL | 🔄 In Progress | Optimized for large datasets | +| MySQL | 📋 Roadmap | Compatible with MySQL 5.7+ | + +### API Adapters + +| Adapter | Status | Notes | +|---------|--------|-------| +| Custom API Configuration | 🔄 In Progress | Flexible HTTP endpoint support | +| Salesforce | 🔄 In Progress | Native API integration | + +### LLM Connectors + +| Model/Service | Status | Notes | +|---------------|--------|-------| +| OpenAI | ✅ Available | GPT-3.5, GPT-4 support | +| Anthropic | ✅ Available | Claude models supported | +| vLLM (Open-Source) | ✅ Available | Self-hosted inference | +| Ollama | ✅ Available | Local model deployment | +| GroqAI | 🔄 In Progress | Fast inference support | +| Vertex AI | ✅ Available | Google Cloud integration | +| Bedrock | 🔄 In Progress | AWS integration coming soon | + +### Authentication Providers + +| Provider | Status | Notes | +|----------|--------|-------| +| Google Auth | ✅ Available | OAuth 2.0 support | +| Microsoft AD/Entra | ✅ Available | Enterprise SSO ready | +| Okta | 📋 Roadmap | Q1 2026 | +| SAML 2.0 | 📋 Roadmap | Q1 2026 | + +### Audit & Observability + +| Feature | Status | Notes | +|---------|--------|-------| +| Application Metrics | ✅ Available | Prometheus-compatible | +| Application Logs | ✅ Available | Structured logging | +| AI Token Tracking | ✅ Available | Token tracking per agent | +| Open Telemetry | ✅ Available | Full OTel support | +| AI Audit Logging | 🔄 In Progress | Detailed decision trails (Q4 2024) | +| AI Guardrails | 📋 Roadmap | Policy enforcement (Q2 2025) | + +### Frontend SDK + +| Feature | Status | Notes | +|---------|--------|-------| +| Component Library | ✅ Available | React components ready | +| AI-Based No-Code Builder | 📋 Roadmap | Visual agent creation (Q2 2025) | +| Low Code AI Agent Builder | ✅ Available | YAML based builder available | + +### Release Timeline + +| Quarter | Milestone | Features | +|---------|-----------|----------| +| **Nov 2025** | Public ReadMe | Publish readme and take in community feedback | +| **Dec 2025** | Open source Beta | Beta release with working MVP in open-source | +| **Q1 2026** | Enterprise Ready | Advanced RBAC, More Data source Integrations| +| **Q1 2026** | Rootflo Wavefront Cloud | On-Device Agent Deployment, Multi-Model Orchestration | +| **Q2 2026** | Advanced Features | No-Code Agent Builder, Advanced Analytics & Dashboarding | + +See [ROADMAP.md](ROADMAP.md) for detailed feature plans and contribution opportunities. -Create custom tools easily with the `@flo_tool` decorator: +--- -```python -from flo_ai.tool import flo_tool +## 🤝 Contributing -@flo_tool(description="Get current weather for a city") -async def get_weather(city: str, country: str = None) -> str: - """Get weather information for a specific city.""" - # Your weather API implementation - return f"Weather in {city}: sunny, 25°C" +We welcome contributions from the community! Whether it's bug reports, feature requests, or code contributions: -# Use in agent - agent = ( - AgentBuilder() - .with_name('Weather Assistant') - .with_llm(OpenAI(model='gpt-4o-mini')) - .with_tools([get_weather.tool]) - .build() - ) -``` +1. Fork the repository +2. Create a feature branch (`git checkout -b feature/amazing-feature`) +3. Commit your changes (`git commit -m 'Add amazing feature'`) +4. Push to the branch (`git push origin feature/amazing-feature`) +5. Open a Pull Request -### Variables System +See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines. -Dynamic variable resolution in agent prompts using `` syntax: +--- -```python -# Create agent with variables -agent = ( - AgentBuilder() - .with_name('Data Analyst') - .with_prompt('Analyze and focus on . Generate insights for .') - .with_llm(OpenAI(model='gpt-4o-mini')) - .build() -) - -# Define variables at runtime -variables = { - 'dataset_path': '/data/sales_q4_2024.csv', - 'key_metric': 'revenue growth', - 'target_audience': 'executive team' -} - -result = await agent.run( - 'Please provide a comprehensive analysis with actionable recommendations.', - variables=variables -) -``` - -### Document Processing - -Process PDF and TXT documents with AI agents: - -```python -from flo_ai.models.document import DocumentMessage, DocumentType - - # Create document message - document = DocumentMessage( - document_type=DocumentType.PDF, - document_file_path='business_report.pdf' - ) - -# Process with agent -agent = ( - AgentBuilder() - .with_name('Document Analyzer') - .with_prompt('Analyze the provided document and extract key insights.') - .with_llm(OpenAI(model='gpt-4o-mini')) - .build() -) - - result = await agent.run([document]) -``` - -### Output Formatting - -Use Pydantic models for structured outputs: - -```python -from pydantic import BaseModel, Field - -class AnalysisResult(BaseModel): - summary: str = Field(description="Executive summary") - key_findings: list = Field(description="List of key findings") - recommendations: list = Field(description="Actionable recommendations") - -agent = ( - AgentBuilder() - .with_name('Business Analyst') - .with_llm(OpenAI(model='gpt-4o')) - .with_output_schema(AnalysisResult) - .build() -) -``` - -### Error Handling - -Built-in retry mechanisms and error recovery: - -```python -agent = ( - AgentBuilder() - .with_name('Robust Agent') - .with_llm(OpenAI(model='gpt-4o')) - .with_retries(3) # Retry up to 3 times on failure - .build() -) -``` - -## 🔄 Agent Orchestration with Arium - -Arium is Flo AI's powerful workflow orchestration engine for creating complex multi-agent workflows. - -### Simple Agent Chains - -```python -from flo_ai.arium import AriumBuilder -from flo_ai.models.agent import Agent -from flo_ai.llm import OpenAI - -async def simple_chain(): - llm = OpenAI(model='gpt-4o-mini') - - # Create agents - analyst = Agent( - name='content_analyst', - system_prompt='Analyze the input and extract key insights.', - llm=llm - ) - - summarizer = Agent( - name='summarizer', - system_prompt='Create a concise summary based on the analysis.', - llm=llm - ) - - # Build and run workflow - result = await ( - AriumBuilder() - .add_agents([analyst, summarizer]) - .start_with(analyst) - .connect(analyst, summarizer) - .end_with(summarizer) - .build_and_run(["Analyze this complex business report..."]) - ) - - return result -``` - -### Conditional Routing - -```python -from flo_ai.arium.memory import BaseMemory - - def route_by_type(memory: BaseMemory) -> str: - """Route based on classification result""" - messages = memory.get() - last_message = str(messages[-1]) if messages else "" - - if "technical" in last_message.lower(): - return "tech_specialist" - else: - return "business_specialist" - - # Build workflow with conditional routing -result = await ( - AriumBuilder() - .add_agents([classifier, tech_specialist, business_specialist, final_agent]) - .start_with(classifier) - .add_edge(classifier, [tech_specialist, business_specialist], route_by_type) - .connect(tech_specialist, final_agent) - .connect(business_specialist, final_agent) - .end_with(final_agent) - .build_and_run(["How can we optimize our database performance?"]) - ) -``` - -### YAML-Based Workflows - -Define entire workflows in YAML: - -```yaml -metadata: - name: "content-analysis-workflow" - version: "1.0.0" - description: "Multi-agent content analysis pipeline" - -arium: - agents: - - name: "analyzer" - role: "Content Analyst" - job: "Analyze the input content and extract key insights." - model: - provider: "openai" - name: "gpt-4o-mini" - - - name: "summarizer" - role: "Content Summarizer" - job: "Create a concise summary based on the analysis." - model: - provider: "anthropic" - name: "claude-3-5-sonnet-20240620" - - workflow: - start: "analyzer" - edges: - - from: "analyzer" - to: ["summarizer"] - end: ["summarizer"] -``` - -```python -# Run YAML workflow -result = await ( - AriumBuilder() - .from_yaml(yaml_str=workflow_yaml) - .build_and_run(["Analyze this quarterly business report..."]) - ) -``` - -### LLM-Powered Routers - -Define intelligent routing logic directly in YAML: - -```yaml - routers: - - name: "content_type_router" - type: "smart" # Uses LLM for intelligent routing - routing_options: - technical_writer: "Technical content, documentation, tutorials" - creative_writer: "Creative writing, storytelling, fiction" - marketing_writer: "Marketing copy, sales content, campaigns" - model: - provider: "openai" - name: "gpt-4o-mini" -``` - -### ReflectionRouter & PlanExecuteRouter - -**ReflectionRouter** for A→B→A→C feedback patterns: - -```yaml - routers: - - name: "reflection_router" - type: "reflection" - flow_pattern: [writer, critic, writer] # A → B → A pattern - model: - provider: "openai" - name: "gpt-4o-mini" -``` - -**PlanExecuteRouter** for Cursor-style plan-and-execute workflows: - -```yaml -routers: - - name: "plan_router" - type: "plan_execute" - agents: - planner: "Creates detailed execution plans" - developer: "Implements features according to plan" - tester: "Tests implementations and validates functionality" - reviewer: "Reviews and approves completed work" - settings: - planner_agent: planner - executor_agent: developer - reviewer_agent: reviewer -``` - -## 📊 OpenTelemetry Integration - -Built-in observability for production monitoring: - -```python -from flo_ai import configure_telemetry, shutdown_telemetry - -# Configure at startup -configure_telemetry( - service_name="my_ai_app", - service_version="1.0.0", - console_export=True # For debugging -) - -# Your application code here... - -# Shutdown to flush data -shutdown_telemetry() -``` - -**📖 [Complete Telemetry Guide →](flo_ai/flo_ai/telemetry/README.md)** - -## 📚 Examples & Documentation - -### Examples Directory - -Check out the `examples/` directory for comprehensive examples: - -- `agent_builder_usage.py` - Basic agent creation patterns -- `yaml_agent_example.py` - YAML-based agent configuration -- `output_formatter.py` - Structured output examples -- `multi_tool_example.py` - Multi-tool agent examples -- `document_processing_example.py` - Document processing with PDF and TXT files +## 📄 License -### Documentation - -Visit our [website](https://www.rootflo.ai) to know more +Wavefront AI is licensed under the Apache License 2.0. See [LICENSE](LICENSE) for details. -**Additional Resources:** +--- -- [@flo_tool Decorator Guide](TOOLS.md) - Complete guide to the `@flo_tool` decorator -- [Examples Directory](flo_ai/examples/) - Ready-to-run code examples -- [Contributing Guide](CONTRIBUTING.md) - How to contribute to Flo AI +## 🙏 Acknowledgments -## 🌟 Why Flo AI? +Wavefront AI was built with inspiration from leading open-source projects in the AI infrastructure space. Special thanks to our early adopters and community contributors. -### For Developers +--- -- **Simple Setup**: Get started in minutes with minimal configuration -- **Flexible**: Use YAML or code-based configuration -- **Production Ready**: Built-in error handling and retry mechanisms -- **Multi-LLM**: Switch between providers easily +## ⭐ Show Your Support -### For Teams +If you find Wavefront AI useful, please consider: -- **Maintainable**: YAML-first approach makes configurations versionable -- **Testable**: Each component can be tested independently -- **Scalable**: From simple agents to complex multi-tool systems +- Starring this repository ⭐ +- Sharing with your network +- Contributing to the project +- Providing feedback and feature requests -### Use Cases +--- -- 🤖 Customer Service Automation -- 📊 Data Analysis and Processing -- 📝 Content Generation and Summarization -- 🔍 Research and Information Retrieval -- 🎯 Task-Specific AI Assistants -- 📧 Email Analysis and Classification +**Ready to transform your enterprise AI infrastructure?** Get started with [Wavefront AI today](GETTING_STARTED.md). -## 🤝 Contributing -We love your input! Check out our [Contributing Guide](CONTRIBUTING.md) to get started. Ways to contribute: -- 🐛 Report bugs -- 💡 Propose new features -- 📝 Improve documentation -- 🔧 Submit PRs -## 📜 License -Flo AI is [MIT Licensed](LICENSE). ---- -
- Built with ❤️ by the rootflo team -
Community • - Documentation -
diff --git a/flo_ai/README.md b/flo_ai/README.md index f28f4ce1..46f03072 100644 --- a/flo_ai/README.md +++ b/flo_ai/README.md @@ -1,5 +1,5 @@

- Rootflo + Rootflo

Flo AI 🌊

@@ -601,4 +601,4 @@ Flo AI is [MIT Licensed](LICENSE). Built with ❤️ by the rootflo team
CommunityDocumentation - + \ No newline at end of file From 584cada5ac1f84b76b3df08dfa17a1a2b38750ba Mon Sep 17 00:00:00 2001 From: vizsatiz Date: Sat, 15 Nov 2025 14:58:48 +0530 Subject: [PATCH 02/29] Force push middleware image --- images/middleware-stack.png | Bin 0 -> 92908 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/middleware-stack.png diff --git a/images/middleware-stack.png b/images/middleware-stack.png new file mode 100644 index 0000000000000000000000000000000000000000..a38715662547918797fff6ec5ee99685ee1b528f GIT binary patch literal 92908 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 DQKlw; literal 0 HcmV?d00001 From 66df4a709366605d7c9a85d1e928686c238c81b0 Mon Sep 17 00:00:00 2001 From: vizsatiz Date: Sat, 15 Nov 2025 15:50:52 +0530 Subject: [PATCH 03/29] Fix contributions.md & roadmap.md --- CONTRIBUTING.md | 657 +++++++++++++++++++++++++++++++++++++++++++++++- README.md | 10 +- ROADMAP.md | 433 ++++++++++++++++++++++++++++--- 3 files changed, 1047 insertions(+), 53 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7674455a..a785716c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,16 +1,655 @@ -# Contributions +# Contributing to Flo AI -FloAI is open-source and we welcome contributions. If you're looking to contribute, please: +Thank you for your interest in contributing to Flo AI! We welcome contributions from the community and are excited to work with you. -Fork the repository. -Create a new branch for your feature. -Add your feature or improvement. -Send a pull request. +This guide will help you get started with contributing to the Flo AI project. Please read it carefully before making your first contribution. -We appreciate your input! +> **Note**: This contributing guide currently focuses on **Flo AI**, the core agent building and orchestration library. **Wavefront AI** (the enterprise middleware platform) is currently in development and will be open-sourced in the future. When Wavefront AI is released, we will update this guide with additional contribution guidelines for the middleware platform. -## Installing Dependencies +--- -```cmd +## 📋 Table of Contents + +- [Code of Conduct](#code-of-conduct) +- [Getting Started](#getting-started) +- [Development Environment Setup](#development-environment-setup) +- [Project Structure](#project-structure) +- [Development Workflow](#development-workflow) +- [Code Style and Standards](#code-style-and-standards) +- [Testing Guidelines](#testing-guidelines) +- [Documentation Guidelines](#documentation-guidelines) +- [Commit Message Guidelines](#commit-message-guidelines) +- [Pull Request Process](#pull-request-process) +- [Types of Contributions](#types-of-contributions) +- [Questions and Support](#questions-and-support) + +--- + +## 📜 Code of Conduct + +This project adheres to a [Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to vishnu@rootflo.ai. + +--- + +## 🚀 Getting Started + +### Prerequisites + +Before you begin, ensure you have: + +- **Python 3.10 or higher** (check with `python --version`) +- **Git** installed and configured +- **uv** package manager (recommended) or **pip/poetry** +- **API keys** for LLM providers (for testing): + - OpenAI API key (optional, for OpenAI tests) + - Anthropic API key (optional, for Claude tests) + - Google API key (optional, for Gemini tests) + +### Fork and Clone + +1. **Fork the repository** on GitHub +2. **Clone your fork**: + ```bash + git clone https://github.com/your-username/flo-ai.git + cd flo-ai + ``` +3. **Add upstream remote**: + ```bash + git remote add upstream https://github.com/rootflo/flo-ai.git + ``` + +--- + +## 🛠️ Development Environment Setup + +### Python Environment + +We recommend using `uv` for dependency management: + +```bash +# Install uv if you haven't already +curl -LsSf https://astral.sh/uv/install.sh | sh + +# Navigate to flo_ai directory +cd flo_ai + +# Sync dependencies (installs all dependencies including dev dependencies) uv sync + +# Activate the virtual environment +source .venv/bin/activate # On macOS/Linux +# or +.venv\Scripts\activate # On Windows ``` + +Alternatively, using pip: + +```bash +# Navigate to flo_ai directory +cd flo_ai + +# Install in development mode +pip install -e . + +# Install development dependencies +pip install -e ".[dev]" +``` + +### Environment Variables + +Set up your API keys for testing (create a `.env` file or export them): + +```bash +# OpenAI (optional) +export OPENAI_API_KEY="your-openai-key" + +# Anthropic (optional) +export ANTHROPIC_API_KEY="your-anthropic-key" + +# Google Gemini (optional) +export GOOGLE_API_KEY="your-google-key" + +# For Google Vertex AI (optional) +export GOOGLE_APPLICATION_CREDENTIALS="path/to/service-account.json" +export GOOGLE_CLOUD_PROJECT="your-project-id" +``` + +### Verify Installation + +Test your installation: + +```bash +# Run the test suite +pytest tests/unit-tests/ + +# Run a specific test +pytest tests/unit-tests/test_agent_builder_tools.py +``` + +### Flo AI Studio Setup (Optional) + +If you're contributing to the Studio frontend: + +```bash +cd studio + +# Install dependencies +pnpm install + +# Start development server +pnpm dev + +# The studio will be available at http://localhost:5173 +``` + +--- + +## 📁 Project Structure + +Understanding the project structure will help you navigate the codebase: + +``` +flo/ +├── flo_ai/ # Flo AI Python library +│ ├── flo_ai/ # Core package +│ │ ├── builder/ # Agent builder components +│ │ ├── llm/ # LLM provider integrations +│ │ ├── tool/ # Tool framework +│ │ ├── arium/ # Workflow orchestration +│ │ ├── models/ # Data models +│ │ ├── telemetry/ # Observability +│ │ └── utils/ # Utility functions +│ ├── examples/ # Example implementations +│ ├── tests/ # Test suite +│ │ ├── unit-tests/ # Unit tests +│ │ └── integration-tests/ # Integration tests +│ └── docs/ # Documentation +├── studio/ # Flo AI Studio (React/TypeScript) +│ ├── src/ # Source code +│ └── package.json # Dependencies +├── documentation/ # Project documentation (MDX) +├── flo_ai_tools/ # Community tools and connectors +└── README.md # Main project README +``` + +--- + +## 🔄 Development Workflow + +### 1. Create a Branch + +Always create a new branch for your work: + +```bash +# Update your local main branch +git checkout main +git pull upstream main + +# Create a new branch +git checkout -b feature/your-feature-name +# or +git checkout -b fix/your-bug-fix +# or +git checkout -b docs/your-documentation-update +``` + +**Branch naming conventions:** +- `feature/` - New features +- `fix/` - Bug fixes +- `docs/` - Documentation updates +- `refactor/` - Code refactoring +- `test/` - Test additions or updates +- `chore/` - Maintenance tasks + +### 2. Make Your Changes + +- Write clean, maintainable code +- Follow the code style guidelines (see below) +- Add tests for new features +- Update documentation as needed +- Keep commits focused and atomic + +### 3. Test Your Changes + +```bash +# Run all tests +pytest + +# Run specific test file +pytest tests/unit-tests/test_your_file.py + +# Run with coverage +pytest --cov=flo_ai --cov-report=html + +# Run integration tests (requires API keys) +pytest tests/integration-tests/ -m integration +``` + +### 4. Commit Your Changes + +Use [Conventional Commits](https://www.conventionalcommits.org/) format: + +```bash +git commit -m "feat: add new feature description" +git commit -m "fix: resolve bug in agent builder" +git commit -m "docs: update contributing guide" +``` + +**Commit types:** +- `feat:` - New feature +- `fix:` - Bug fix +- `docs:` - Documentation changes +- `style:` - Code style changes (formatting, etc.) +- `refactor:` - Code refactoring +- `test:` - Test additions or updates +- `chore:` - Maintenance tasks +- `perf:` - Performance improvements +- `ci:` - CI/CD changes + +### 5. Keep Your Branch Updated + +Regularly sync with upstream: + +```bash +git fetch upstream +git rebase upstream/main +``` + +### 6. Push and Create Pull Request + +```bash +# Push to your fork +git push origin feature/your-feature-name + +# Then create a Pull Request on GitHub +``` + +--- + +## 💻 Code Style and Standards + +### Python Code Style + +We use **pre-commit hooks** to ensure code quality. Set it up: + +```bash +# Install pre-commit +pip install pre-commit + +# Install hooks +pre-commit install + +# Run on all files (optional, but recommended) +pre-commit run --all-files +``` + +**Key style guidelines:** + +1. **Follow PEP 8** - Python style guide +2. **Type hints** - Use type hints for function signatures: + ```python + from typing import Optional, List + + async def process_data( + items: List[str], + limit: Optional[int] = None + ) -> dict: + ... + ``` +3. **Docstrings** - Use Google-style docstrings: + ```python + def my_function(param1: str, param2: int) -> bool: + """Brief description of the function. + + Args: + param1: Description of param1 + param2: Description of param2 + + Returns: + Description of return value + + Raises: + ValueError: When something goes wrong + """ + ``` +4. **Async/Await** - Use async/await for I/O operations +5. **Error Handling** - Use appropriate exception types and provide clear error messages + +### TypeScript/JavaScript (Studio) + +For Studio contributions: + +- Use **TypeScript** for all new code +- Follow existing component structure +- Use functional components with hooks +- Add proper error handling +- Follow the existing naming conventions + +### Code Formatting + +The pre-commit hooks will automatically format your code using: +- **Black** - Python code formatter +- **isort** - Import sorting +- **flake8** - Linting + +You can also run these manually: + +```bash +# Format Python code +black flo_ai/ + +# Sort imports +isort flo_ai/ + +# Lint +flake8 flo_ai/ +``` + +--- + +## 🧪 Testing Guidelines + +### Writing Tests + +1. **Test Coverage** - Aim for high test coverage, especially for new features +2. **Test Organization**: + - Unit tests in `tests/unit-tests/` + - Integration tests in `tests/integration-tests/` + - Mark integration tests with `@pytest.mark.integration` + +3. **Test Naming**: + ```python + def test_function_name_with_condition_returns_expected(): + """Test that function_name returns expected when condition is met.""" + ``` + +4. **Async Tests**: + ```python + import pytest + + @pytest.mark.asyncio + async def test_async_function(): + result = await my_async_function() + assert result == expected + ``` + +5. **Fixtures** - Use pytest fixtures for common setup: + ```python + @pytest.fixture + def sample_agent(): + return AgentBuilder().with_name('test').build() + ``` + +### Running Tests + +```bash +# Run all unit tests +pytest tests/unit-tests/ + +# Run specific test file +pytest tests/unit-tests/test_agent_builder.py + +# Run with verbose output +pytest -v + +# Run with coverage +pytest --cov=flo_ai --cov-report=term-missing + +# Run only integration tests (requires API keys) +pytest tests/integration-tests/ -m integration + +# Skip integration tests +pytest -m "not integration" +``` + +### Test Requirements + +- All tests must pass before submitting a PR +- New features should include tests +- Bug fixes should include regression tests +- Integration tests are optional but encouraged for LLM integrations + +--- + +## 📚 Documentation Guidelines + +### Code Documentation + +- **Docstrings** - All public functions, classes, and methods should have docstrings +- **Type hints** - Use type hints for better IDE support and documentation +- **Comments** - Add comments for complex logic, but prefer self-documenting code + +### Documentation Updates + +When adding new features, update: + +1. **README.md** - If the feature is user-facing +2. **API Documentation** - If adding new APIs +3. **Examples** - Add examples in `flo_ai/examples/` if applicable +4. **Docstrings** - Update docstrings for any changed functions + +### Documentation Format + +- Use Markdown for documentation files +- Use MDX for the documentation site +- Include code examples where helpful +- Keep documentation up-to-date with code changes + +--- + +## 📝 Commit Message Guidelines + +We follow [Conventional Commits](https://www.conventionalcommits.org/) specification: + +``` +(): + + + +