xynehq/jaf-py

GitHub: xynehq/jaf-py

一个基于纯函数式编程范式的生产级 Python AI Agent 框架,提供不可变状态、MCP 支持、企业级安全防护与全链路可观测性。

Stars: 9 | Forks: 7

# JAF (Juspay Agent Framework) - Python 实现 [![Version](https://img.shields.io/badge/version-2.6.13-blue.svg)](https://github.com/xynehq/jaf-py) [![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/) [![Docs](https://img.shields.io/badge/Docs-Live-brightgreen)](https://xynehq.github.io/jaf-py/) 一个纯函数式的 agent 框架,具备不可变状态和可组合的 tools,由 TypeScript 专业转换至 Python。JAF 能够构建生产级 AI agent 系统,并内置安全性、可观测性和错误处理。 **生产就绪**:与 TypeScript 版本功能完全对齐,拥有全面的测试套件和生产部署支持。 ## **[阅读完整文档](https://xynehq.github.io/jaf-py/)** **[ 快速开始 →](https://xynehq.github.io/jaf-py/getting-started/)** | **[ API 参考 →](https://xynehq.github.io/jaf-py/api-reference/)** | **[ 示例 →](https://xynehq.github.io/jaf-py/examples/)** ## 核心特性 ### **完整的 TypeScript 转换** - **功能完全对齐**:所有 TypeScript 功能均已转换为 Python - **类型安全**:带有运行时校验的 Pydantic 模型 - **不可变状态**:保留了函数式编程原则 - **Tool 集成**:完整的 tool 调用和执行系统 ### **生产级就绪服务器** - **FastAPI 服务器**:高性能异步 HTTP API - **自动化文档**:通过 `/docs` 提供交互式 API 文档 - **健康监控**:内置健康检查和指标 - **CORS 支持**:为浏览器集成做好准备 ### Model Context Protocol (MCP) - **MCP Client**:完整的 MCP 规范支持 - **Stdio & SSE**:支持多种传输协议 - **Tool 集成**:无缝集成 MCP tool - **自动发现**:从 MCP server 动态加载 tool ### **企业级安全** - **输入 Guardrails**:内容过滤和校验 - **输出 Guardrails**:响应净化 - **权限系统**:基于角色的访问控制 - **审计日志**:完整的交互追踪 - **代理支持**:支持带身份验证的企业级代理集成 ### **可观测性与监控** - **实时追踪**:事件驱动的可观测性 - **OpenTelemetry 集成**:支持 OTLP 的分布式追踪 - **Langfuse 追踪**:LLM 可观测性与数据分析 - **结构化日志**:JSON 格式的日志 - **错误处理**:全面的错误类型和恢复机制 - **性能指标**:内置耗时统计与计数器 ### **Agent-as-Tool 架构** - **分层编排**:将 agent 作为其他 agent 中的 tool 使用 - **条件性 Tool 启用**:根据上下文启用/禁用 agent tool - **会话管理**:为子 agent 配置会话继承 - **灵活的输出提取**:为 agent tool 输出提供自定义提取器 ### **开发者体验** - **CLI 工具**:项目初始化与管理 - **热重载**:具备自动重载功能的开发服务器 - **类型提示**:完全兼容 mypy - **丰富的示例**:包含 RAG、多 agent、agent-as-tool 和 server 演示 - **可视化架构**:基于 Graphviz 生成的 agent 和 tool 关系图 ## 核心理念 - **不可变性**:所有核心数据结构都是深度不可变的 - **纯函数**:核心逻辑以纯净、可预测的函数表达 - **边缘效应**:副作用被隔离在 Provider 模块中 - **组合优于配置**:通过组合简单的函数来构建复杂的行为 - **设计上的类型安全**:利用 Python 的类型系统和 Pydantic 保障运行时安全 ## 快速开始 ### 安装 ``` # 从 GitHub 安装(开发版本) pip install git+https://github.com/xynehq/jaf-py.git # 或者安装所有可选依赖 pip install "jaf-py[all] @ git+https://github.com/xynehq/jaf-py.git" # 安装特定功能集 pip install "jaf-py[server] @ git+https://github.com/xynehq/jaf-py.git" # FastAPI server support pip install "jaf-py[memory] @ git+https://github.com/xynehq/jaf-py.git" # Redis/PostgreSQL memory providers pip install "jaf-py[visualization] @ git+https://github.com/xynehq/jaf-py.git" # Graphviz visualization tools pip install "jaf-py[tracing] @ git+https://github.com/xynehq/jaf-py.git" # OpenTelemetry and Langfuse tracing pip install "jaf-py[dev] @ git+https://github.com/xynehq/jaf-py.git" # Development tools ``` ### CLI 用法 JAF 包含一个用于项目管理的强大 CLI: ``` # 初始化新的 JAF 项目 jaf init my-agent-project # 运行开发服务器 jaf server --host 0.0.0.0 --port 8000 # 显示版本和帮助 jaf version jaf --help ``` ### 开发环境设置 ``` git clone https://github.com/xynehq/jaf-py cd jaf-py pip install -e ".[dev]" # 运行测试 pytest # 类型检查和 linting mypy jaf/ ruff check jaf/ black jaf/ # 文档 pip install -r requirements-docs.txt ./docs.sh serve # Start documentation server ./docs.sh deploy # Deploy to GitHub Pages ``` ## 文档 ### **[官方文档网站](https://xynehq.github.io/jaf-py/)** 完整且支持搜索的文档可在 **[xynehq.github.io/jaf-py](https://xynehq.github.io/jaf-py/)** 获取,包含: - **交互式导航**,支持搜索和过滤 - **暗黑/明亮模式**,支持自动检测系统偏好 - **移动端响应式设计**,适合在任何设备上查阅文档 - **实时代码示例**,带语法高亮 - **API 参考**,包含自动生成的文档 - **始终保持最新**,通过自动化部署同步 ### **本地文档** 为了支持离线访问,文档也可以在 [`docs/`](docs/) 目录中找到: - **[ 文档中心](docs/README.md)** - 您探索所有文档的起点 - **[ 快速入门](docs/getting-started.md)** - 安装说明与首个 agent 教程 - **[ 核心概念](docs/core-concepts.md)** - JAF 的函数式架构原则 - **[ API 参考](docs/api-reference.md)** - 完整的 Python API 文档 - **[ Tool 指南](docs/tools.md)** - 创建和使用 tool - **[ 记忆系统](docs/memory-system.md)** - 持久化与记忆 provider - **[ 模型 Provider](docs/model-providers.md)** - LiteLLM 集成 - **[ 监控](docs/monitoring.md)** - 可观测性、指标与预警 - **[ 服务器 API](docs/server-api.md)** - FastAPI endpoint 参考 - **[ 部署](docs/deployment.md)** - 生产环境部署指南 - **[ 示例](docs/examples.md)** - 详细的示例解析 - **[ 故障排除](docs/troubleshooting.md)** - 常见问题与解决方案 ## 项目结构 ``` jaf-py/ ├── docs/ # Complete documentation ├── jaf/ # Core framework package │ ├── core/ # Core types and engine │ ├── memory/ # Conversation persistence │ ├── providers/ # External integrations (LiteLLM, MCP) │ ├── policies/ # Validation and security │ ├── server/ # FastAPI server │ └── cli.py # Command-line interface ├── examples/ # Example applications └── tests/ # Test suite ``` ## 架构可视化 JAF 包含强大的可视化功能,可帮助您理解和记录 agent 系统。 ### 前置条件 首先,安装系统 Graphviz 依赖: ``` # macOS brew install graphviz # Ubuntu/Debian sudo apt-get install graphviz # Windows(通过 Chocolatey) choco install graphviz ``` 然后安装带有可视化支持的 JAF: ``` pip install "jaf-py[visualization]" ``` ### 快速开始 ``` import asyncio from jaf import Agent, Tool, generate_agent_graph, GraphOptions # 创建你的 agent agent = Agent( name='MyAgent', instructions=lambda state: "I am a helpful assistant.", tools=[my_tool], handoffs=['OtherAgent'] ) # 生成可视化 async def main(): result = await generate_agent_graph( [agent], GraphOptions( title="My Agent System", output_path="./my-agents.png", color_scheme="modern", show_tool_details=True ) ) if result.success: print(f" Visualization saved to: {result.output_path}") else: print(f"❌ Error: {result.error}") asyncio.run(main()) ``` ### 特性 - **多种配色方案**:可从 `default`、`modern` 或 `minimal` 主题中选择 - **Agent 架构**:可视化 agent、tool 及其移交关系 - **Tool 生态系统**:生成专用的 tool 交互图 - **Runner 架构**:展示包含会话层的完整系统架构 - **多种格式**:导出为 PNG、SVG 或 PDF - **自定义布局**:支持多种 Graphviz 布局(`dot`、`circo`、`neato` 等) ### 输出示例 可视化系统会生成清晰、专业的图表,展示: - **Agent 节点**:带有 agent 名称和模型信息的圆角矩形 - **Tool 节点**:展示 tool 名称和描述的椭圆 - **移交边**:指示 agent 移交关系的虚线 - **Tool 连接**:将 agent 连接到其 tool 的彩色边 - **集群组织**:在 runner 架构视图中对组件进行分组 ### 高级用法 ``` from jaf.visualization import run_visualization_examples # 运行综合示例 await run_visualization_examples() # 这将生成多个示例文件: # - ./examples/agent-graph.png(agent 系统概览) # - ./examples/tool-graph.png(tool 生态系统) # - ./examples/runner-architecture.png(完整系统) # - ./examples/agent-modern.png(现代配色方案) ``` ## 核心组件 ### 核心类型 ``` from dataclasses import dataclass from pydantic import BaseModel, Field from jaf import Agent, Tool, RunState, run # 定义你的 context 类型 @dataclass class MyContext: user_id: str permissions: list[str] # 定义 tool schema class CalculateArgs(BaseModel): expression: str = Field(description="Math expression to evaluate") # 创建 tool class CalculatorTool: @property def schema(self): return type('ToolSchema', (), { 'name': 'calculate', 'description': 'Perform mathematical calculations', 'parameters': CalculateArgs })() async def execute(self, args: CalculateArgs, context: MyContext) -> str: result = eval(args.expression) # Don't do this in production! return f"{args.expression} = {result}" # 定义 agent def create_math_agent(): def instructions(state): return 'You are a helpful math tutor' return Agent( name='MathTutor', instructions=instructions, tools=[CalculatorTool()] ) ``` ### 运行框架 ``` import asyncio from jaf import run, make_litellm_provider, generate_run_id, generate_trace_id from jaf.core.types import RunState, RunConfig, Message async def main(): model_provider = make_litellm_provider('http://localhost:4000') math_agent = create_math_agent() config = RunConfig( agent_registry={'MathTutor': math_agent}, model_provider=model_provider, max_turns=10, on_event=lambda event: print(event), # Real-time tracing ) initial_state = RunState( run_id=generate_run_id(), trace_id=generate_trace_id(), messages=[Message(role='user', content='What is 2 + 2?')], current_agent_name='MathTutor', context=MyContext(user_id='user123', permissions=['user']), turn_count=0, ) result = await run(initial_state, config) print(result.outcome.output if result.outcome.status == 'completed' else result.outcome.error) asyncio.run(main()) ``` ## 安全与校验 ### 可组合的校验策略 ``` from jaf.policies.validation import create_path_validator, create_permission_validator, compose_validations # 创建独立验证器 path_validator = create_path_validator(['/shared', '/public']) permission_validator = create_permission_validator('admin', lambda ctx: ctx) # 组合它们 combined_validator = compose_validations(path_validator, permission_validator) # 应用到 tool secure_file_tool = with_validation(base_file_tool, combined_validator) ``` ### Guardrails ``` from jaf.policies.validation import create_content_filter, create_length_guardrail config = RunConfig( # ... other config initial_input_guardrails=[ create_content_filter(['spam', 'inappropriate']), # Requires blocked patterns create_length_guardrail(max_length=1000, min_length=1) ], final_output_guardrails=[ create_content_filter(['harmful', 'unsafe']) ], ) ``` ## Agent-as-Tool 功能 JAF 2.2+ 引入了强大的 agent-as-tool 功能,允许您将 agent 作为 tool 在其他 agent 中使用,以实现分层编排: ``` from jaf.core.agent_tool import create_agent_tool from jaf.core.types import create_json_output_extractor # 创建专用 agent spanish_agent = Agent( name="spanish_translator", instructions=lambda state: "Translate text to Spanish", output_codec=TranslationOutput ) french_agent = Agent( name="french_translator", instructions=lambda state: "Translate text to French", output_codec=TranslationOutput ) # 通过条件启用将 agent 转换为 tool spanish_tool = spanish_agent.as_tool( tool_name="translate_to_spanish", tool_description="Translate text to Spanish", max_turns=3, custom_output_extractor=create_json_output_extractor(), is_enabled=True # Always enabled ) french_tool = french_agent.as_tool( tool_name="translate_to_french", tool_description="Translate text to French", max_turns=3, custom_output_extractor=create_json_output_extractor(), is_enabled=lambda context, agent: context.language_preference == "french_spanish" ) # 使用 agent tool 创建 orchestrator agent orchestrator = Agent( name="translation_orchestrator", instructions=lambda state: "Use translation tools to respond in multiple languages", tools=[spanish_tool, french_tool] ) ``` ### 核心特性: - **条件性启用**:根据运行时上下文启用/禁用 agent tool - **会话管理**:配置子 agent 是否继承父会话状态 - **自定义输出提取**:定义如何提取和格式化 agent tool 的输出 - **错误处理**:针对失败的 agent tool 执行提供健壮的错误处理 ## 🔗 Agent 移交 ``` from jaf.policies.handoff import create_handoff_guardrail, HandoffPolicy from pydantic import BaseModel from enum import Enum class AgentName(str, Enum): MATH_TUTOR = 'MathTutor' FILE_MANAGER = 'FileManager' class HandoffOutput(BaseModel): agent_name: AgentName def create_triage_agent(): def instructions(state): return 'Route requests to specialized agents' return Agent( name='TriageAgent', instructions=instructions, tools=[], # Regular tools would go here handoffs=['MathTutor', 'FileManager'], # Allowed handoff targets output_schema=HandoffOutput, ) ``` ## 可观测性 ### 实时追踪 ``` from jaf.core.tracing import ConsoleTraceCollector, FileTraceCollector, create_composite_trace_collector # 控制台日志 console_tracer = ConsoleTraceCollector() # 文件日志 file_tracer = FileTraceCollector('./traces.log') # 复合 tracing tracer = create_composite_trace_collector(console_tracer, file_tracer) config = RunConfig( # ... other config on_event=tracer.collect, ) ``` ### OpenTelemetry 集成 JAF 2.2+ 内置了用于分布式追踪的 OpenTelemetry 支持: ``` import os from jaf.core.tracing import create_composite_trace_collector, ConsoleTraceCollector # 配置 OpenTelemetry endpoint os.environ["TRACE_COLLECTOR_URL"] = "http://localhost:4318/v1/traces" # 在创建 composite collector 时将自动配置 tracing trace_collector = create_composite_trace_collector(ConsoleTraceCollector()) config = RunConfig( # ... other config on_event=trace_collector.collect, ) ``` ### Langfuse 集成 用于针对 LLM 的专门可观测性和数据分析: ``` import os from jaf.core.tracing import create_composite_trace_collector, ConsoleTraceCollector # 配置 Langfuse 凭证 os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-your-public-key" os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-your-secret-key" os.environ["LANGFUSE_HOST"] = "https://cloud.langfuse.com" # or your self-hosted instance # Langfuse tracing 将自动配置 trace_collector = create_composite_trace_collector(ConsoleTraceCollector()) config = RunConfig( # ... other config on_event=trace_collector.collect, ) ``` ### 错误处理 ``` from jaf.core.errors import JAFErrorHandler if result.outcome.status == 'error': formatted_error = JAFErrorHandler.format_error(result.outcome.error) is_retryable = JAFErrorHandler.is_retryable(result.outcome.error) severity = JAFErrorHandler.get_severity(result.outcome.error) print(f"[{severity}] {formatted_error} (retryable: {is_retryable})") ``` ## Provider 集成 ### A2A (Agent-to-Agent) 通信 JAF 提供了一个健壮的 A2A 通信层,允许 agent 相互交互。这对于构建具有不同专业技能 agent 的多 agent 系统非常有用。 ``` from jaf.a2a import create_a2a_agent, create_a2a_client, create_a2a_server # 创建 agent echo_agent = create_a2a_agent("EchoBot", "Echoes messages", "You are an echo bot.", []) ping_agent = create_a2a_agent("PingBot", "Responds to pings", "You are a ping bot.", []) # 创建 server server_config = { "agents": {"EchoBot": echo_agent, "PingBot": ping_agent}, "agentCard": {"name": "Test Server"}, "port": 8080, } server = create_a2a_server(server_config) # 创建 client client = create_a2a_client("http://localhost:8080") ``` ### LiteLLM Provider ``` from jaf.providers.model import make_litellm_provider # 连接到 LiteLLM proxy 以支持 100+ 模型 model_provider = make_litellm_provider( 'http://localhost:4000', # LiteLLM proxy URL 'your-api-key' # Optional API key ) ``` ### MCP (Model Context Protocol) 集成 JAF 包含对 Model Context Protocol 的完整支持,以实现无缝的 tool 集成: ``` from jaf.providers.mcp import create_mcp_stdio_client, create_mcp_tools_from_client # 通过 stdio 连接到 MCP server mcp_client = create_mcp_stdio_client(['python', '-m', 'my_mcp_server']) # 初始化并获取所有可用 tool await mcp_client.initialize() mcp_tools = await create_mcp_tools_from_client(mcp_client) # 在你的 agent 中使用 MCP tool def create_mcp_agent(): def instructions(state): return "You have access to powerful MCP tools for various tasks." return Agent( name='MCPAgent', instructions=instructions, tools=mcp_tools # Automatically converted JAF tools ) # 也支持 SSE client from jaf.providers.mcp import create_mcp_sse_client sse_client = create_mcp_sse_client('http://localhost:8080/sse') ``` ## 开发服务器 JAF 包含一个内置的开发服务器,用于通过 HTTP endpoint 在本地测试 agent: ``` from jaf.server import run_server from jaf.providers.model import make_litellm_provider def create_my_agent(): def instructions(state): return 'You are a helpful assistant' return Agent( name='MyAgent', instructions=instructions, tools=[calculator_tool, greeting_tool] ) model_provider = make_litellm_provider('http://localhost:4000') # 在端口 3000 上启动 server await run_server( [create_my_agent()], {'model_provider': model_provider}, {'port': 3000} ) ``` 服务器提供 RESTful endpoint: - `GET /health` - 健康检查 - `GET /agents` - 列出可用 agent - `POST /chat` - 通用聊天 endpoint - `POST /agents/{name}/chat` - 指定 agent 的 endpoint ## 函数组合 JAF 支持函数式组合模式,可以通过简单、可重用的函数构建复杂的行为: ``` from jaf import create_function_tool, ToolSource # 具有缓存和重试功能的增强型 tool def with_cache(tool_func): cache = {} async def cached_execute(args, context): cache_key = str(args) if cache_key in cache: return cache[cache_key] result = await tool_func(args, context) if result.status == "success": cache[cache_key] = result return result return cached_execute # 通过组合创建增强型 tool enhanced_tool = create_function_tool({ 'name': 'enhanced_search', 'description': 'Search with caching', 'execute': with_cache(base_search_function), 'parameters': SearchArgs, 'source': ToolSource.NATIVE }) ``` **核心优势:** - **重用性**:一次编写,处处组合 - **可测试性**:每个函数都可以独立测试 - **类型安全**:支持完整的类型检查 - **性能**:可独立优化各个部分 ## 示例应用 探索示例应用,观察框架的实际运行情况: ### 1. 多 Agent 服务器演示 ``` cd examples python server_example.py ``` **演示特性:** - 多个专业 agent(数学、天气、通用) - Tool 集成(计算器、天气 API) - Agent 移交与路由 - 带有自动化文档的 RESTful API - 实时追踪与错误处理 - 生产级服务器配置 **可用 endpoint:** - `GET /health` - 服务器健康检查 - `GET /agents` - 列出所有可用 agent - `POST /chat` - 与任何 agent 聊天 - `GET /docs` - 交互式 API 文档 ### 2. Agent-as-Tool 演示 ``` cd examples python agent_as_tool_example.py # 或作为 server 启动 python agent_as_tool_example.py --server ``` **演示特性:** - 分层 agent 编排 - 基于上下文的条件性 tool 启用 - 从 agent tool 提取自定义输出 - 子 agent 的会话管理 - 翻译 agent 协同工作 ### 3. 追踪集成演示 ``` # OpenTelemetry tracing 示例 cd examples python otel_tracing_demo.py # Langfuse tracing 示例 python langfuse_tracing_demo.py ``` **演示特性:** - OpenTelemetry 分布式追踪设置 - Langfuse LLM 可观测性集成 - 组合式 trace 收集器 - 实时监控与分析 ### 4. MCP 集成演示 ``` cd examples/mcp_demo python main.py ``` **演示特性:** - Model Context Protocol 集成 - 从 MCP server 动态加载 tool - 安全的文件系统操作 - MCP client 配置与管理 ## 测试 ``` pytest # Run tests ruff check . # Lint code mypy . # Type checking black . # Format code ``` ## 架构原则 ### 不可变状态机 - 所有状态转换都会创建新的状态对象 - 不修改现有的数据结构 - 状态转换可预测、可测试 ### 类型安全 - 使用 Pydantic schema 进行运行时校验 - 使用 Python 类型提示提供编译时安全性 - 使用 NewType 实现类型安全的标识符 ### 纯函数 - 核心逻辑无副作用 - 易于测试和推理 - 行为确定性 ### 副作用隔离 - 副作用仅存在于 Provider 模块中 - 纯代码与非纯代码之间有清晰的边界 - 更容易进行模拟和测试 ## 📜 许可证 MIT ## 🤝 贡献 1. Fork 该仓库 2. 创建一个功能分支 3. 为新功能添加测试 4. 运行测试套件 5. 提交 pull request **JAF (Juspay Agentic Framework) v2.2** - 构建函数式 AI agent 系统的未来
标签:AI Agent框架, AV绕过, FastAPI, MCP, Python, 人工智能, 函数式编程, 搜索引擎查询, 无后门, 测试用例, 用户代理, 用户模式Hook绕过, 逆向工具