{"id":34723047,"url":"https://github.com/getaxonflow/axonflow-sdk-java","last_synced_at":"2026-04-08T23:01:16.339Z","repository":{"id":329196742,"uuid":"1118369265","full_name":"getaxonflow/axonflow-sdk-java","owner":"getaxonflow","description":"Official Java SDK for AxonFlow - AI Governance Platform","archived":false,"fork":false,"pushed_at":"2026-03-09T07:02:22.000Z","size":522,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-09T10:22:37.320Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/getaxonflow.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-17T16:44:47.000Z","updated_at":"2026-03-09T04:59:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/getaxonflow/axonflow-sdk-java","commit_stats":null,"previous_names":["getaxonflow/axonflow-sdk-java"],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/getaxonflow/axonflow-sdk-java","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getaxonflow%2Faxonflow-sdk-java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getaxonflow%2Faxonflow-sdk-java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getaxonflow%2Faxonflow-sdk-java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getaxonflow%2Faxonflow-sdk-java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/getaxonflow","download_url":"https://codeload.github.com/getaxonflow/axonflow-sdk-java/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getaxonflow%2Faxonflow-sdk-java/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30519069,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-14T19:51:21.629Z","status":"ssl_error","status_checked_at":"2026-03-14T19:51:12.959Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-12-25T02:00:33.520Z","updated_at":"2026-04-08T23:01:16.323Z","avatar_url":"https://github.com/getaxonflow.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AxonFlow Java SDK\n\nOfficial Java SDK for [AxonFlow](https://getaxonflow.com) - AI Governance Platform for Enterprise LLM Applications.\n\n[![CI](https://github.com/getaxonflow/axonflow-sdk-java/actions/workflows/ci.yml/badge.svg)](https://github.com/getaxonflow/axonflow-sdk-java/actions/workflows/ci.yml)\n[![Maven Central](https://img.shields.io/maven-central/v/com.getaxonflow/axonflow-sdk.svg)](https://search.maven.org/artifact/com.getaxonflow/axonflow-sdk)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)\n\n\u003e **Evaluating AxonFlow in production?** We're opening limited Design Partner slots.\n\u003e\n\u003e Free 30-minute architecture and incident-readiness review, priority issue triage, roadmap input, and early feature access.\n\u003e\n\u003e [Apply here](https://getaxonflow.com/design-partner?utm_source=readme_sdk_java) or email [design-partners@getaxonflow.com](mailto:design-partners@getaxonflow.com).\n\u003e\n\u003e No commitment required. We reply within 48 hours.\n\n\u003e **Questions or feedback?**\n\u003e\n\u003e Comment in [GitHub Discussions](https://github.com/getaxonflow/axonflow/discussions/239) or email [hello@getaxonflow.com](mailto:hello@getaxonflow.com) for private feedback.\n\n## How This SDK Fits with AxonFlow\n\nThis SDK is a client library for interacting with a running AxonFlow control plane. It is used from application or agent code to send execution context, policies, and requests at runtime.\n\nA deployed AxonFlow platform (self-hosted or cloud) is required for end-to-end AI governance. SDKs alone are not sufficient—the platform and SDKs are designed to be used together.\n\n### Architecture Overview (2 min)\n\nIf you're new to AxonFlow, this short video shows how the control plane and SDKs work together in a real production setup:\n\n[![AxonFlow Architecture Overview](https://img.youtube.com/vi/WwQXHKuZhxc/maxresdefault.jpg)](https://youtu.be/WwQXHKuZhxc)\n\n▶️ [Watch on YouTube](https://youtu.be/WwQXHKuZhxc)\n\n## Requirements\n\n- Java 11 or higher\n- Maven 3.6+ or Gradle 6.0+\n\n## Installation\n\n### Maven\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.getaxonflow\u003c/groupId\u003e\n    \u003cartifactId\u003eaxonflow-sdk\u003c/artifactId\u003e\n    \u003cversion\u003e4.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### Gradle\n\n```groovy\nimplementation 'com.getaxonflow:axonflow-sdk:4.0.0'\n```\n\n## Evaluation Tier (Free License)\n\nNeed more capacity than Community without moving to Enterprise? Evaluation uses the same core features with higher limits:\n\n| Limit | Community | Evaluation (Free) | Enterprise |\n|-------|-----------|-------------------|------------|\n| Tenant policies | 20 | 50 | Unlimited |\n| Org-wide policies | 0 | 5 | Unlimited |\n| Audit retention | 3 days | 14 days | 3650 days |\n| Concurrent executions | 5 | 25 | Unlimited |\n| Pending execution approvals | 5 | 25 | Unlimited |\n\nConcurrent executions applies to MAP and WCP executions per tenant. Pending execution approvals applies to MAP confirm/step mode and WCP approval queues.\n\n[Get a free Evaluation license](https://getaxonflow.com/evaluation-license?utm_source=readme_sdk_java_eval) · [Full feature matrix](https://docs.getaxonflow.com/docs/features/community-vs-enterprise?utm_source=readme_sdk_java_eval)\n\n## Quick Start\n\n### Gateway Mode (Recommended)\n\nGateway mode provides the most control, allowing you to pre-check requests before making LLM calls:\n\n```java\nimport com.getaxonflow.sdk.AxonFlow;\nimport com.getaxonflow.sdk.AxonFlowConfig;\nimport com.getaxonflow.sdk.types.*;\n\npublic class GatewayExample {\n    public static void main(String[] args) {\n        // Initialize client\n        AxonFlow client = AxonFlow.create(AxonFlowConfig.builder()\n            .endpoint(\"https://agent.getaxonflow.com\")\n            .clientId(\"your-client-id\")\n            .clientSecret(\"your-client-secret\")\n            .build());\n\n        // Step 1: Pre-check the request\n        PolicyApproval approval = client.getPolicyApprovedContext(\n            ClientRequest.builder()\n                .userPrompt(\"What are the latest AI regulations?\")\n                .userId(\"user-123\")\n                .sessionId(\"session-456\")\n                .metadata(Map.of(\"source\", \"web-app\"))\n                .build()\n        );\n\n        // Step 2: Check if request is allowed\n        if (approval.isAllowed()) {\n            // Make your LLM call here\n            String llmResponse = callYourLLM(approval.getModifiedPrompt());\n\n            // Step 3: Audit the response\n            ClientResponse response = client.auditLLMCall(\n                AuditRequest.builder()\n                    .requestId(approval.getRequestId())\n                    .llmResponse(llmResponse)\n                    .model(\"gpt-4\")\n                    .tokenUsage(TokenUsage.builder()\n                        .promptTokens(150)\n                        .completionTokens(200)\n                        .totalTokens(350)\n                        .build())\n                    .latencyMs(450)\n                    .build()\n            );\n\n            System.out.println(\"Response: \" + response.getLlmResponse());\n        } else {\n            System.out.println(\"Request blocked: \" + approval.getBlockedReason());\n        }\n    }\n}\n```\n\n### Proxy Mode\n\nProxy mode is simpler but provides less control - AxonFlow handles the LLM call:\n\n```java\nimport com.getaxonflow.sdk.AxonFlow;\nimport com.getaxonflow.sdk.AxonFlowConfig;\nimport com.getaxonflow.sdk.types.*;\n\npublic class ProxyExample {\n    public static void main(String[] args) {\n        AxonFlow client = AxonFlow.create(AxonFlowConfig.builder()\n            .endpoint(\"https://agent.getaxonflow.com\")\n            .clientId(\"your-client-id\")\n            .clientSecret(\"your-client-secret\")\n            .build());\n\n        ClientResponse response = client.proxyLLMCall(\n            ClientRequest.builder()\n                .userPrompt(\"Summarize the key points of GDPR compliance\")\n                .userId(\"user-123\")\n                .model(\"gpt-4\")\n                .build()\n        );\n\n        if (response.isAllowed()) {\n            System.out.println(response.getLlmResponse());\n        } else {\n            System.out.println(\"Blocked: \" + response.getBlockedPolicyName());\n        }\n    }\n}\n```\n\n## Configuration\n\n### Builder Pattern\n\n```java\nAxonFlowConfig config = AxonFlowConfig.builder()\n    .endpoint(\"https://agent.getaxonflow.com\")  // Required\n    .clientId(\"your-client-id\")\n            .clientSecret(\"your-client-secret\")             // Required for cloud\n    .timeout(Duration.ofSeconds(30))            // Default: 60s\n    .debug(true)                                // Enable request logging\n    .insecureSkipVerify(false)                  // SSL verification (default: false)\n    .build();\n\nAxonFlow client = AxonFlow.create(config);\n```\n\n### Environment Variables\n\nThe SDK supports configuration via environment variables:\n\n| Variable | Description |\n|----------|-------------|\n| `AXONFLOW_AGENT_URL` | AxonFlow agent URL |\n| `AXONFLOW_CLIENT_ID` | OAuth2 client ID for authentication |\n| `AXONFLOW_CLIENT_SECRET` | OAuth2 client secret for authentication |\n| `AXONFLOW_DEBUG` | Enable debug logging (`true`/`false`) |\n\n## API Reference\n\n### Core Methods\n\n| Method | Description |\n|--------|-------------|\n| `getPolicyApprovedContext(request)` | Pre-check request against policies (Gateway Mode step 1) |\n| `auditLLMCall(request)` | Audit LLM response (Gateway Mode step 2) |\n| `proxyLLMCall(request)` | Execute query through proxy (Proxy Mode) |\n| `healthCheck()` | Check agent health status |\n\n### Multi-Agent Planning (MAP)\n\n```java\n// Generate a plan\nPlanRequest planRequest = PlanRequest.builder()\n    .goal(\"Research and summarize AI regulations\")\n    .domain(\"legal\")\n    .userId(\"user-123\")\n    .maxSteps(5)\n    .build();\n\nPlanResponse plan = client.generatePlan(planRequest);\n\n// Execute a plan step\nStepExecutionRequest stepRequest = StepExecutionRequest.builder()\n    .planId(plan.getPlanId())\n    .stepIndex(0)\n    .build();\n\nStepExecutionResponse result = client.executeStep(stepRequest);\n\n// Get plan status\nPlanStatusResponse status = client.getPlanStatus(plan.getPlanId());\n```\n\n### MCP Connectors\n\n```java\n// Query an MCP connector\nMCPQueryRequest query = MCPQueryRequest.builder()\n    .connectorName(\"amadeus-flights\")\n    .operation(\"search\")\n    .parameters(Map.of(\n        \"origin\", \"JFK\",\n        \"destination\", \"LAX\",\n        \"date\", \"2024-03-15\"\n    ))\n    .build();\n\nMCPQueryResponse response = client.queryConnector(query);\n```\n\n### MCP Policy Features (v3.2.0)\n\n**Exfiltration Detection** - Prevent large-scale data extraction:\n\n```java\n// Query with exfiltration limits (default: 10K rows, 10MB)\nMCPQueryResponse response = client.queryConnector(query);\n\n// Check exfiltration info\nPolicyInfo.ExfiltrationCheck exCheck = response.getPolicyInfo().getExfiltrationCheck();\nif (exCheck.isExceeded()) {\n    System.out.println(\"Limit exceeded: \" + exCheck.getLimitType());\n    // LimitType: \"rows\" or \"bytes\"\n}\n\n// Configure: MCP_MAX_ROWS_PER_QUERY=1000, MCP_MAX_BYTES_PER_QUERY=5242880\n```\n\n**Dynamic Policy Evaluation** - Orchestrator-based rate limiting, budget controls:\n\n```java\n// Response includes dynamic policy info when enabled\nPolicyInfo.DynamicPolicyInfo dynamicInfo = response.getPolicyInfo().getDynamicPolicyInfo();\nif (dynamicInfo.isOrchestratorReachable()) {\n    System.out.println(\"Policies evaluated: \" + dynamicInfo.getPoliciesEvaluated());\n    for (PolicyMatch match : dynamicInfo.getMatchedPolicies()) {\n        System.out.println(\"  \" + match.getPolicyName() + \": \" + match.getAction());\n    }\n}\n\n// Enable: MCP_DYNAMIC_POLICIES_ENABLED=true\n```\n\n### Policy Management\n\n```java\n// List policies\nList\u003cPolicy\u003e policies = client.listPolicies();\n\n// Get specific policy\nPolicy policy = client.getPolicy(\"sql-injection-prevention\");\n```\n\n## Error Handling\n\nThe SDK provides typed exceptions for different error scenarios:\n\n```java\ntry {\n    PolicyApproval approval = client.getPolicyApprovedContext(request);\n} catch (AxonFlowAuthenticationException e) {\n    // Invalid or missing credentials\n    System.err.println(\"Authentication failed: \" + e.getMessage());\n} catch (AxonFlowRateLimitException e) {\n    // Rate limit exceeded\n    System.err.println(\"Rate limited. Retry after: \" + e.getRetryAfterSeconds() + \"s\");\n} catch (AxonFlowValidationException e) {\n    // Invalid request parameters\n    System.err.println(\"Validation error: \" + e.getMessage());\n} catch (AxonFlowNetworkException e) {\n    // Network/connectivity issues\n    System.err.println(\"Network error: \" + e.getMessage());\n} catch (AxonFlowException e) {\n    // Other SDK errors\n    System.err.println(\"Error: \" + e.getMessage());\n}\n```\n\n## Retry Configuration\n\nThe SDK includes automatic retry with exponential backoff:\n\n```java\nAxonFlowConfig config = AxonFlowConfig.builder()\n    .endpoint(\"https://agent.getaxonflow.com\")\n    .clientId(\"your-client-id\")\n            .clientSecret(\"your-client-secret\")\n    .retryConfig(RetryConfig.builder()\n        .maxAttempts(3)\n        .initialDelayMs(100)\n        .maxDelayMs(5000)\n        .multiplier(2.0)\n        .retryableStatusCodes(Set.of(429, 500, 502, 503, 504))\n        .build())\n    .build();\n```\n\n## Response Caching\n\nEnable caching for repeated policy checks:\n\n```java\nAxonFlowConfig config = AxonFlowConfig.builder()\n    .endpoint(\"https://agent.getaxonflow.com\")\n    .clientId(\"your-client-id\")\n            .clientSecret(\"your-client-secret\")\n    .cacheEnabled(true)\n    .cacheTtl(Duration.ofMinutes(5))\n    .cacheMaxSize(1000)\n    .build();\n```\n\n## LLM Interceptors\n\nThe SDK provides interceptors for wrapping OpenAI and Anthropic API calls with automatic governance, enabling transparent policy enforcement without changing your application code.\n\n### OpenAI Interceptor\n\n```java\nimport com.getaxonflow.sdk.AxonFlow;\nimport com.getaxonflow.sdk.AxonFlowConfig;\nimport com.getaxonflow.sdk.interceptors.*;\n\n// Initialize AxonFlow client\nAxonFlow axonflow = AxonFlow.create(AxonFlowConfig.builder()\n    .endpoint(\"https://agent.getaxonflow.com\")\n    .clientId(\"your-client-id\")\n            .clientSecret(\"your-client-secret\")\n    .build());\n\n// Create interceptor\nOpenAIInterceptor interceptor = OpenAIInterceptor.builder()\n    .axonflow(axonflow)\n    .userToken(\"user-123\")\n    .asyncAudit(true)  // Fire-and-forget audit logging\n    .build();\n\n// Wrap your OpenAI call\nChatCompletionResponse response = interceptor.wrap(request -\u003e {\n    // Your actual OpenAI SDK call here\n    return yourOpenAIClient.createChatCompletion(request);\n}).apply(ChatCompletionRequest.builder()\n    .model(\"gpt-4\")\n    .addUserMessage(\"Hello, world!\")\n    .temperature(0.7)\n    .maxTokens(1024)\n    .build());\n\n// Or use the static wrapper for one-off calls\nChatCompletionResponse response = OpenAIInterceptor.wrapChatCompletion(\n    axonflow,\n    \"user-123\",\n    request -\u003e yourOpenAIClient.createChatCompletion(request)\n).apply(request);\n```\n\n### Anthropic Interceptor\n\n```java\nimport com.getaxonflow.sdk.interceptors.AnthropicInterceptor;\nimport com.getaxonflow.sdk.interceptors.AnthropicInterceptor.*;\n\n// Create interceptor\nAnthropicInterceptor interceptor = AnthropicInterceptor.builder()\n    .axonflow(axonflow)\n    .userToken(\"user-123\")\n    .build();\n\n// Wrap your Anthropic call\nAnthropicResponse response = interceptor.wrap(request -\u003e {\n    // Your actual Anthropic SDK call here\n    return yourAnthropicClient.createMessage(request);\n}).apply(AnthropicRequest.builder()\n    .model(\"claude-3-sonnet-20240229\")\n    .maxTokens(1024)\n    .system(\"You are a helpful assistant.\")\n    .addUserMessage(\"Hello, Claude!\")\n    .temperature(0.7)\n    .build());\n```\n\n### Async Support\n\nBoth interceptors support async operations with `CompletableFuture`:\n\n```java\n// Async OpenAI call\nCompletableFuture\u003cChatCompletionResponse\u003e future = interceptor.wrapAsync(\n    request -\u003e yourOpenAIClient.createChatCompletionAsync(request)\n).apply(request);\n\nfuture.thenAccept(response -\u003e {\n    System.out.println(\"Response: \" + response.getContent());\n});\n```\n\n### Policy Violations\n\nWhen a request is blocked by policy, the interceptor throws a `PolicyViolationException`:\n\n```java\ntry {\n    ChatCompletionResponse response = interceptor.wrap(openaiCall).apply(request);\n} catch (PolicyViolationException e) {\n    System.err.println(\"Blocked by policy: \" + e.getPolicyName());\n    System.err.println(\"Reason: \" + e.getBlockReason());\n}\n```\n\n## Thread Safety\n\nThe `AxonFlow` client is thread-safe and designed for reuse. Create a single instance and share it across your application:\n\n```java\n// Create once at application startup\nAxonFlow client = AxonFlow.create(config);\n\n// Reuse across threads\nexecutorService.submit(() -\u003e client.proxyLLMCall(request1));\nexecutorService.submit(() -\u003e client.proxyLLMCall(request2));\n```\n\n## Logging\n\nThe SDK uses SLF4J for logging. Add your preferred logging implementation:\n\n```xml\n\u003c!-- Logback --\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003ech.qos.logback\u003c/groupId\u003e\n    \u003cartifactId\u003elogback-classic\u003c/artifactId\u003e\n    \u003cversion\u003e1.4.14\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nEnable debug logging for request/response details:\n\n```java\nAxonFlowConfig config = AxonFlowConfig.builder()\n    .endpoint(\"https://agent.getaxonflow.com\")\n    .debug(true)\n    .build();\n```\n\n## Spring Boot Integration\n\nSee our [Spring Boot Integration Guide](https://docs.getaxonflow.com/docs/sdk/java-getting-started) for:\n\n- Auto-configuration\n- Spring Security integration\n- Request interceptors\n- Health indicators\n\n## Examples\n\nComplete working examples for all features are available in the [examples folder](https://github.com/getaxonflow/axonflow/tree/main/examples).\n\n### Community Features\n\n```java\n// PII Detection - Automatically detect sensitive data\nPolicyApproval result = client.getPolicyApprovedContext(\n    ClientRequest.builder()\n        .userPrompt(\"My SSN is 123-45-6789\")\n        .userId(\"user-123\")\n        .build()\n);\n// result.isAllowed() = true, result.requiresRedaction() = true (SSN detected)\n\n// SQL Injection Detection - Block malicious queries\nPolicyApproval result = client.getPolicyApprovedContext(\n    ClientRequest.builder()\n        .userPrompt(\"SELECT * FROM users; DROP TABLE users;\")\n        .userId(\"user-123\")\n        .build()\n);\n// result.isAllowed() = false, result.getBlockedReason() = \"SQL injection detected\"\n\n// Static Policies - List and manage built-in policies\nList\u003cPolicy\u003e policies = client.listPolicies();\n// Returns: [Policy{name=\"pii-detection\", enabled=true}, ...]\n\n// Dynamic Policies - Create runtime policies\nclient.createDynamicPolicy(DynamicPolicyRequest.builder()\n    .name(\"block-competitor-queries\")\n    .conditions(Map.of(\"contains\", List.of(\"competitor\", \"pricing\")))\n    .action(\"block\")\n    .build());\n\n// MCP Connectors - Query external data sources\nMCPQueryResponse resp = client.queryConnector(MCPQueryRequest.builder()\n    .connectorName(\"postgres-db\")\n    .operation(\"query\")\n    .parameters(Map.of(\"sql\", \"SELECT name FROM customers\"))\n    .build());\n\n// Multi-Agent Planning - Orchestrate complex workflows\nPlanResponse plan = client.generatePlan(PlanRequest.builder()\n    .goal(\"Research AI governance regulations\")\n    .domain(\"legal\")\n    .build());\nStepExecutionResponse result = client.executePlan(plan.getPlanId());\n\n// Audit Logging - Track all LLM interactions\nclient.auditLLMCall(AuditRequest.builder()\n    .requestId(approval.getRequestId())\n    .llmResponse(llmResponse)\n    .model(\"gpt-4\")\n    .tokenUsage(TokenUsage.builder()\n        .promptTokens(100)\n        .completionTokens(200)\n        .totalTokens(300)\n        .build())\n    .latencyMs(450)\n    .build());\n```\n\n### Enterprise Features\n\nThese features require an AxonFlow Enterprise license:\n\n```java\n// Code Governance - Automated PR reviews with AI\nPRReviewResponse prResult = client.reviewPullRequest(PRReviewRequest.builder()\n    .repoOwner(\"your-org\")\n    .repoName(\"your-repo\")\n    .prNumber(123)\n    .checkTypes(List.of(\"security\", \"style\", \"performance\"))\n    .build());\n\n// Cost Controls - Budget management for LLM usage\nBudget budget = client.getBudget(\"team-engineering\");\n// Returns: Budget{limit=1000.00, used=234.56, remaining=765.44}\n\n// MCP Policy Enforcement - Automatic PII redaction in connector responses\nMCPQueryResponse resp = client.queryConnector(query);\n// resp.getPolicyInfo().isRedacted() = true\n// resp.getPolicyInfo().getRedactedFields() = [\"ssn\", \"credit_card\"]\n```\n\nFor enterprise features, contact [sales@getaxonflow.com](mailto:sales@getaxonflow.com).\n\n## Telemetry\n\nThis SDK sends anonymous usage telemetry (SDK version, OS, enabled features) to help improve AxonFlow.\nNo prompts, payloads, or PII are ever collected. Opt out: `AXONFLOW_TELEMETRY=off` or `DO_NOT_TRACK=1`.\nSee [Telemetry Documentation](https://docs.getaxonflow.com/docs/telemetry) for full details.\n\n## Contributing\n\nWe welcome contributions. Please see our [Contributing Guide](CONTRIBUTING.md) for details.\n\n## License\n\nThis SDK is licensed under the [Apache License 2.0](LICENSE).\n\n## Support\n\n- **Documentation**: https://docs.getaxonflow.com\n- **Issues**: https://github.com/getaxonflow/axonflow-sdk-java/issues\n- **Email**: hello@getaxonflow.com\n\nIf you are evaluating AxonFlow in a company setting and cannot open a public issue, you can share feedback or blockers confidentially here:\n[Anonymous evaluation feedback form](https://getaxonflow.com/feedback)\n\nNo email required. Optional contact if you want a response.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetaxonflow%2Faxonflow-sdk-java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgetaxonflow%2Faxonflow-sdk-java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetaxonflow%2Faxonflow-sdk-java/lists"}