revenium-python-sdk 0.4.0__tar.gz → 0.5.0__tar.gz
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.
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/PKG-INFO +50 -1
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/README.md +45 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/pyproject.toml +6 -1
- revenium_python_sdk-0.5.0/revenium_middleware/griptape/__init__.py +35 -0
- revenium_python_sdk-0.5.0/revenium_middleware/griptape/_metadata.py +10 -0
- revenium_python_sdk-0.5.0/revenium_middleware/griptape/anthropic_driver.py +87 -0
- revenium_python_sdk-0.5.0/revenium_middleware/griptape/litellm_driver.py +527 -0
- revenium_python_sdk-0.5.0/revenium_middleware/griptape/ollama_driver.py +87 -0
- revenium_python_sdk-0.5.0/revenium_middleware/griptape/openai_driver.py +133 -0
- revenium_python_sdk-0.5.0/revenium_middleware/griptape/openai_embedding_driver.py +121 -0
- revenium_python_sdk-0.5.0/revenium_middleware/griptape/universal_driver.py +527 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_python_sdk.egg-info/PKG-INFO +50 -1
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_python_sdk.egg-info/SOURCES.txt +8 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_python_sdk.egg-info/requires.txt +9 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/LICENSE +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/config.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/context.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/decorators.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/enforcement.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/exceptions.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/fields.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/log_sanitize.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/metering.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/metering_buffer.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/metering_submission.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/outcomes.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/patch_registry.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/prompt_extraction.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/subscriber.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_core/trace_fields.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/LICENSE +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_base_client.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_client.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_compat.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_constants.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_exceptions.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_files.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_models.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_qs.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_resource.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_response.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_streaming.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_types.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_utils/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_utils/_logs.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_utils/_proxy.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_utils/_reflection.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_utils/_resources_proxy.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_utils/_streams.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_utils/_sync.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_utils/_transform.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_utils/_typing.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_utils/_utils.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/_version.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/context.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/decorator.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/py.typed +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/resources/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/resources/ai.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/resources/apis.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/resources/events.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/types/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/types/ai_create_audio_params.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/types/ai_create_completion_params.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/types/ai_create_image_params.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/types/ai_create_video_params.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/types/api_meter_request_params.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/types/api_meter_response_params.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/types/event_create_params.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/_metering/types/metering_response_resource.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/agentic_outcomes.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/anthropic/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/anthropic/bedrock_adapter.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/anthropic/bedrock_transport.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/anthropic/config.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/anthropic/middleware.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/anthropic/prompt_extractor.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/anthropic/provider.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/anthropic/stream_create.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/anthropic/trace_fields.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/fal/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/fal/_metering.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/fal/config.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/fal/middleware.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/fal/trace_fields.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/common/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/common/exceptions.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/common/protocols.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/common/trace_fields.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/common/types.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/common/utils.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/config.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/google_ai/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/google_ai/middleware.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/google_ai/provider.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/prompt_extractor.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/vertex_ai/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/vertex_ai/middleware.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/google/vertex_ai/provider.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/job_context.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/job_history.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/client/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/client/config.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/client/context.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/client/decorators.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/client/hooks.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/client/integrations/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/client/integrations/crewai.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/client/middleware.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/client/trace_fields.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/client/validation.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/proxy/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/litellm/proxy/middleware.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/ollama/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/ollama/middleware.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/ollama/trace_fields.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/openai/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/openai/azure_config.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/openai/azure_model_resolver.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/openai/config.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/openai/exceptions.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/openai/langchain/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/openai/langchain/_utils.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/openai/langchain/unified_handler.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/openai/middleware.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/openai/prompt_extractor.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/openai/provider.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/openai/trace_fields.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/perplexity/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/perplexity/middleware.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/perplexity/perplexity_sdk.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/perplexity/provider.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/perplexity/trace_fields.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/webhooks/__init__.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_middleware/webhooks/_verify.py +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_python_sdk.egg-info/dependency_links.txt +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/revenium_python_sdk.egg-info/top_level.txt +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/setup.cfg +0 -0
- {revenium_python_sdk-0.4.0 → revenium_python_sdk-0.5.0}/tests/test_metering.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: revenium-python-sdk
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: The official Revenium Python SDK — unified AI metering middleware for OpenAI, Anthropic, Google, Ollama, LiteLLM, Perplexity, and fal.ai.
|
|
5
5
|
Author-email: Revenium <support@revenium.io>
|
|
6
6
|
License: MIT
|
|
@@ -36,6 +36,9 @@ Provides-Extra: langchain
|
|
|
36
36
|
Requires-Dist: langchain>=0.1.16; extra == "langchain"
|
|
37
37
|
Requires-Dist: langchain-openai>=0.1.0; extra == "langchain"
|
|
38
38
|
Requires-Dist: langchain-core>=0.1.0; extra == "langchain"
|
|
39
|
+
Provides-Extra: griptape
|
|
40
|
+
Requires-Dist: griptape<2.0.0,>=1.0.0; python_version >= "3.10" and extra == "griptape"
|
|
41
|
+
Requires-Dist: requests>=2.25.0; extra == "griptape"
|
|
39
42
|
Provides-Extra: perplexity
|
|
40
43
|
Requires-Dist: wrapt>=1.14.0; extra == "perplexity"
|
|
41
44
|
Requires-Dist: python-dotenv>=0.19.0; extra == "perplexity"
|
|
@@ -89,6 +92,7 @@ Requires-Dist: python-dotenv>=0.19.0; extra == "dev"
|
|
|
89
92
|
Requires-Dist: anthropic>=0.30.0; extra == "dev"
|
|
90
93
|
Requires-Dist: boto3; extra == "dev"
|
|
91
94
|
Requires-Dist: ollama>=0.3.0; extra == "dev"
|
|
95
|
+
Requires-Dist: griptape<2.0.0,>=1.0.0; python_version >= "3.10" and extra == "dev"
|
|
92
96
|
Dynamic: license-file
|
|
93
97
|
|
|
94
98
|
# Revenium Python SDK
|
|
@@ -132,6 +136,7 @@ The official Revenium Python SDK — unified AI metering middleware for deeply a
|
|
|
132
136
|
| Perplexity (Native SDK) | `perplexity-native` | `pip install revenium-python-sdk[perplexity-native]` |
|
|
133
137
|
| fal.ai | `fal` | `pip install revenium-python-sdk[fal]` |
|
|
134
138
|
| LangChain | `langchain` | `pip install revenium-python-sdk[langchain]` |
|
|
139
|
+
| Griptape | `griptape` | `pip install revenium-python-sdk[griptape]` |
|
|
135
140
|
|
|
136
141
|
## Feature Matrix
|
|
137
142
|
|
|
@@ -147,6 +152,7 @@ The official Revenium Python SDK — unified AI metering middleware for deeply a
|
|
|
147
152
|
| Terminal Summary | Yes | Yes | Yes | Yes | Yes | - | - |
|
|
148
153
|
| Azure / Bedrock | Azure | Bedrock | Vertex AI | - | All | - | - |
|
|
149
154
|
| LangChain Integration | Yes | - | - | - | - | - | - |
|
|
155
|
+
| Griptape Integration | Yes | Yes | - | Yes | Yes | - | - |
|
|
150
156
|
| CrewAI Integration | - | - | - | - | Yes | - | - |
|
|
151
157
|
| Proxy Mode | - | - | - | - | Yes | - | - |
|
|
152
158
|
|
|
@@ -959,6 +965,49 @@ Credentials come from the standard environment variables (`REVENIUM_METERING_API
|
|
|
959
965
|
|
|
960
966
|
---
|
|
961
967
|
|
|
968
|
+
### Griptape
|
|
969
|
+
|
|
970
|
+
Metered prompt and embedding drivers for [Griptape](https://github.com/griptape-ai/griptape) applications. Requires Python 3.10+.
|
|
971
|
+
|
|
972
|
+
```bash
|
|
973
|
+
pip install "revenium-python-sdk[griptape,openai]" # OpenAI
|
|
974
|
+
pip install "revenium-python-sdk[griptape,anthropic]" # Anthropic
|
|
975
|
+
pip install "revenium-python-sdk[griptape,ollama]" # Ollama
|
|
976
|
+
pip install "revenium-python-sdk[griptape,litellm,litellm-proxy]" # 100+ providers via LiteLLM
|
|
977
|
+
```
|
|
978
|
+
|
|
979
|
+
`ReveniumDriver` auto-detects the provider from the model name (`gpt-*` → OpenAI, `claude-*` → Anthropic, `llama`/`mistral`/... → Ollama, anything else → LiteLLM) and wraps the matching Griptape prompt driver with Revenium metering:
|
|
980
|
+
|
|
981
|
+
```python
|
|
982
|
+
import os
|
|
983
|
+
from griptape.structures import Agent
|
|
984
|
+
from revenium_middleware.griptape import ReveniumDriver
|
|
985
|
+
|
|
986
|
+
os.environ["REVENIUM_METERING_API_KEY"] = "your_revenium_key"
|
|
987
|
+
|
|
988
|
+
agent = Agent(prompt_driver=ReveniumDriver(
|
|
989
|
+
model="gpt-4o-mini",
|
|
990
|
+
usage_metadata={"task_type": "demo"},
|
|
991
|
+
))
|
|
992
|
+
agent.run("Hello!")
|
|
993
|
+
```
|
|
994
|
+
|
|
995
|
+
Force a provider with `force_provider="litellm"`, or wrap an existing driver with `ReveniumDriver(base_driver=...)`.
|
|
996
|
+
|
|
997
|
+
**Embeddings:**
|
|
998
|
+
|
|
999
|
+
```python
|
|
1000
|
+
from revenium_middleware.griptape import ReveniumEmbeddingDriver
|
|
1001
|
+
|
|
1002
|
+
driver = ReveniumEmbeddingDriver(model="text-embedding-3-large")
|
|
1003
|
+
```
|
|
1004
|
+
|
|
1005
|
+
**Provider-specific drivers:** for direct control, use `ReveniumOpenAiDriver`, `ReveniumAnthropicDriver`, `ReveniumOllamaDriver`, `ReveniumLiteLLMDriver` or `ReveniumOpenAiEmbeddingDriver` — each subclasses the corresponding Griptape driver and accepts a `usage_metadata` dict (see [Metadata Fields](#metadata-fields)).
|
|
1006
|
+
|
|
1007
|
+
**Migrating from `revenium-griptape`:** the standalone package is deprecated — install the `griptape` extra and change `from revenium_griptape import ReveniumDriver` to `from revenium_middleware.griptape import ReveniumDriver`. All driver class names are unchanged. One behaviour difference: the old package called `load_dotenv()` automatically at import time; the SDK never mutates your environment on import, so if you keep credentials in a `.env` file, call `load_dotenv()` yourself before creating a driver.
|
|
1008
|
+
|
|
1009
|
+
---
|
|
1010
|
+
|
|
962
1011
|
## Metadata Fields
|
|
963
1012
|
|
|
964
1013
|
Add business context to any API call by passing a `usage_metadata` dictionary. All fields are optional.
|
|
@@ -39,6 +39,7 @@ The official Revenium Python SDK — unified AI metering middleware for deeply a
|
|
|
39
39
|
| Perplexity (Native SDK) | `perplexity-native` | `pip install revenium-python-sdk[perplexity-native]` |
|
|
40
40
|
| fal.ai | `fal` | `pip install revenium-python-sdk[fal]` |
|
|
41
41
|
| LangChain | `langchain` | `pip install revenium-python-sdk[langchain]` |
|
|
42
|
+
| Griptape | `griptape` | `pip install revenium-python-sdk[griptape]` |
|
|
42
43
|
|
|
43
44
|
## Feature Matrix
|
|
44
45
|
|
|
@@ -54,6 +55,7 @@ The official Revenium Python SDK — unified AI metering middleware for deeply a
|
|
|
54
55
|
| Terminal Summary | Yes | Yes | Yes | Yes | Yes | - | - |
|
|
55
56
|
| Azure / Bedrock | Azure | Bedrock | Vertex AI | - | All | - | - |
|
|
56
57
|
| LangChain Integration | Yes | - | - | - | - | - | - |
|
|
58
|
+
| Griptape Integration | Yes | Yes | - | Yes | Yes | - | - |
|
|
57
59
|
| CrewAI Integration | - | - | - | - | Yes | - | - |
|
|
58
60
|
| Proxy Mode | - | - | - | - | Yes | - | - |
|
|
59
61
|
|
|
@@ -866,6 +868,49 @@ Credentials come from the standard environment variables (`REVENIUM_METERING_API
|
|
|
866
868
|
|
|
867
869
|
---
|
|
868
870
|
|
|
871
|
+
### Griptape
|
|
872
|
+
|
|
873
|
+
Metered prompt and embedding drivers for [Griptape](https://github.com/griptape-ai/griptape) applications. Requires Python 3.10+.
|
|
874
|
+
|
|
875
|
+
```bash
|
|
876
|
+
pip install "revenium-python-sdk[griptape,openai]" # OpenAI
|
|
877
|
+
pip install "revenium-python-sdk[griptape,anthropic]" # Anthropic
|
|
878
|
+
pip install "revenium-python-sdk[griptape,ollama]" # Ollama
|
|
879
|
+
pip install "revenium-python-sdk[griptape,litellm,litellm-proxy]" # 100+ providers via LiteLLM
|
|
880
|
+
```
|
|
881
|
+
|
|
882
|
+
`ReveniumDriver` auto-detects the provider from the model name (`gpt-*` → OpenAI, `claude-*` → Anthropic, `llama`/`mistral`/... → Ollama, anything else → LiteLLM) and wraps the matching Griptape prompt driver with Revenium metering:
|
|
883
|
+
|
|
884
|
+
```python
|
|
885
|
+
import os
|
|
886
|
+
from griptape.structures import Agent
|
|
887
|
+
from revenium_middleware.griptape import ReveniumDriver
|
|
888
|
+
|
|
889
|
+
os.environ["REVENIUM_METERING_API_KEY"] = "your_revenium_key"
|
|
890
|
+
|
|
891
|
+
agent = Agent(prompt_driver=ReveniumDriver(
|
|
892
|
+
model="gpt-4o-mini",
|
|
893
|
+
usage_metadata={"task_type": "demo"},
|
|
894
|
+
))
|
|
895
|
+
agent.run("Hello!")
|
|
896
|
+
```
|
|
897
|
+
|
|
898
|
+
Force a provider with `force_provider="litellm"`, or wrap an existing driver with `ReveniumDriver(base_driver=...)`.
|
|
899
|
+
|
|
900
|
+
**Embeddings:**
|
|
901
|
+
|
|
902
|
+
```python
|
|
903
|
+
from revenium_middleware.griptape import ReveniumEmbeddingDriver
|
|
904
|
+
|
|
905
|
+
driver = ReveniumEmbeddingDriver(model="text-embedding-3-large")
|
|
906
|
+
```
|
|
907
|
+
|
|
908
|
+
**Provider-specific drivers:** for direct control, use `ReveniumOpenAiDriver`, `ReveniumAnthropicDriver`, `ReveniumOllamaDriver`, `ReveniumLiteLLMDriver` or `ReveniumOpenAiEmbeddingDriver` — each subclasses the corresponding Griptape driver and accepts a `usage_metadata` dict (see [Metadata Fields](#metadata-fields)).
|
|
909
|
+
|
|
910
|
+
**Migrating from `revenium-griptape`:** the standalone package is deprecated — install the `griptape` extra and change `from revenium_griptape import ReveniumDriver` to `from revenium_middleware.griptape import ReveniumDriver`. All driver class names are unchanged. One behaviour difference: the old package called `load_dotenv()` automatically at import time; the SDK never mutates your environment on import, so if you keep credentials in a `.env` file, call `load_dotenv()` yourself before creating a driver.
|
|
911
|
+
|
|
912
|
+
---
|
|
913
|
+
|
|
869
914
|
## Metadata Fields
|
|
870
915
|
|
|
871
916
|
Add business context to any API call by passing a `usage_metadata` dictionary. All fields are optional.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "revenium-python-sdk"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.5.0"
|
|
8
8
|
description = "The official Revenium Python SDK — unified AI metering middleware for OpenAI, Anthropic, Google, Ollama, LiteLLM, Perplexity, and fal.ai."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.8"
|
|
@@ -51,6 +51,10 @@ langchain = [
|
|
|
51
51
|
"langchain-openai>=0.1.0",
|
|
52
52
|
"langchain-core>=0.1.0",
|
|
53
53
|
]
|
|
54
|
+
griptape = [
|
|
55
|
+
"griptape>=1.0.0,<2.0.0; python_version >= '3.10'",
|
|
56
|
+
"requests>=2.25.0",
|
|
57
|
+
]
|
|
54
58
|
perplexity = [
|
|
55
59
|
"wrapt>=1.14.0",
|
|
56
60
|
"python-dotenv>=0.19.0",
|
|
@@ -116,6 +120,7 @@ dev = [
|
|
|
116
120
|
"anthropic>=0.30.0",
|
|
117
121
|
"boto3",
|
|
118
122
|
"ollama>=0.3.0",
|
|
123
|
+
"griptape>=1.0.0,<2.0.0; python_version >= '3.10'",
|
|
119
124
|
]
|
|
120
125
|
|
|
121
126
|
[tool.pytest.ini_options]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Revenium metering drivers for the Griptape framework.
|
|
3
|
+
|
|
4
|
+
Universal support for LLM providers through the unified Revenium SDK.
|
|
5
|
+
Install with: pip install "revenium-python-sdk[griptape]"
|
|
6
|
+
|
|
7
|
+
Supported providers:
|
|
8
|
+
- Tier 1 (direct): OpenAI, Anthropic, Ollama
|
|
9
|
+
- Tier 2 (via LiteLLM): Google/Gemini, Cohere, Azure OpenAI, Bedrock, and 100+ others
|
|
10
|
+
"""
|
|
11
|
+
try:
|
|
12
|
+
import griptape # noqa: F401
|
|
13
|
+
except ImportError as exc: # pragma: no cover
|
|
14
|
+
raise ImportError(
|
|
15
|
+
"The griptape package is required for revenium_middleware.griptape. "
|
|
16
|
+
"Install it with: pip install 'revenium-python-sdk[griptape]' "
|
|
17
|
+
"(requires Python 3.10+)."
|
|
18
|
+
) from exc
|
|
19
|
+
|
|
20
|
+
from .universal_driver import ReveniumDriver, ReveniumEmbeddingDriver
|
|
21
|
+
from .openai_driver import ReveniumOpenAiDriver
|
|
22
|
+
from .openai_embedding_driver import ReveniumOpenAiEmbeddingDriver
|
|
23
|
+
from .anthropic_driver import ReveniumAnthropicDriver
|
|
24
|
+
from .ollama_driver import ReveniumOllamaDriver
|
|
25
|
+
from .litellm_driver import ReveniumLiteLLMDriver
|
|
26
|
+
|
|
27
|
+
__all__ = [
|
|
28
|
+
"ReveniumDriver",
|
|
29
|
+
"ReveniumEmbeddingDriver",
|
|
30
|
+
"ReveniumOpenAiDriver",
|
|
31
|
+
"ReveniumOpenAiEmbeddingDriver",
|
|
32
|
+
"ReveniumAnthropicDriver",
|
|
33
|
+
"ReveniumOllamaDriver",
|
|
34
|
+
"ReveniumLiteLLMDriver",
|
|
35
|
+
]
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""Shared usage_metadata helpers for the Griptape drivers."""
|
|
2
|
+
|
|
3
|
+
# Keys that would corrupt the middleware's authentication state if they
|
|
4
|
+
# reached a provider API call.
|
|
5
|
+
_AUTH_KEYS = frozenset({"revenium_api_key", "revenium_api_base_url"})
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def strip_revenium_auth_keys(metadata):
|
|
9
|
+
"""Return a copy of metadata without Revenium auth keys."""
|
|
10
|
+
return {k: v for k, v in metadata.items() if k not in _AUTH_KEYS}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Revenium driver for Anthropic/Claude.
|
|
3
|
+
|
|
4
|
+
This driver extends the Griptape AnthropicPromptDriver to automatically inject
|
|
5
|
+
Revenium usage metadata for tracking and cost monitoring.
|
|
6
|
+
"""
|
|
7
|
+
import logging
|
|
8
|
+
from typing import Dict, Any, Optional
|
|
9
|
+
|
|
10
|
+
from griptape.drivers.prompt.anthropic import AnthropicPromptDriver
|
|
11
|
+
from griptape.common.prompt_stack.prompt_stack import PromptStack
|
|
12
|
+
|
|
13
|
+
from ._metadata import strip_revenium_auth_keys
|
|
14
|
+
|
|
15
|
+
# Import the Revenium middleware for Anthropic - this auto-patches the anthropic client
|
|
16
|
+
try:
|
|
17
|
+
import revenium_middleware.anthropic # noqa: F401
|
|
18
|
+
MIDDLEWARE_AVAILABLE = True
|
|
19
|
+
except ImportError:
|
|
20
|
+
MIDDLEWARE_AVAILABLE = False
|
|
21
|
+
logging.warning(
|
|
22
|
+
"Anthropic middleware could not be loaded. "
|
|
23
|
+
"Install it with: pip install 'revenium-python-sdk[anthropic]'"
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ReveniumAnthropicDriver(AnthropicPromptDriver):
|
|
30
|
+
"""
|
|
31
|
+
Anthropic prompt driver with Revenium usage metering.
|
|
32
|
+
|
|
33
|
+
This driver automatically injects usage metadata into Anthropic API calls
|
|
34
|
+
for tracking and cost monitoring through Revenium.
|
|
35
|
+
|
|
36
|
+
Usage metadata is passed through to the LLM API after stripping the
|
|
37
|
+
Revenium auth keys (revenium_api_key, revenium_api_base_url). Do not
|
|
38
|
+
include other secrets in usage_metadata.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(self, usage_metadata: Optional[Dict[str, Any]] = None, **kwargs):
|
|
42
|
+
"""
|
|
43
|
+
Initialize the Revenium Anthropic driver.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
usage_metadata: Optional metadata for tracking usage (user_id, task_type, etc.)
|
|
47
|
+
**kwargs: All other arguments passed to AnthropicPromptDriver
|
|
48
|
+
"""
|
|
49
|
+
# Store usage metadata as instance variable
|
|
50
|
+
self.usage_metadata = usage_metadata or {}
|
|
51
|
+
|
|
52
|
+
# Initialize parent without usage_metadata
|
|
53
|
+
super().__init__(**kwargs)
|
|
54
|
+
|
|
55
|
+
if not MIDDLEWARE_AVAILABLE:
|
|
56
|
+
logger.warning(
|
|
57
|
+
"Running without the Anthropic middleware. "
|
|
58
|
+
"Usage metering will not be available."
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
def _base_params(self, prompt_stack: PromptStack) -> Dict[str, Any]:
|
|
62
|
+
"""
|
|
63
|
+
Build the base parameters for the Anthropic API call.
|
|
64
|
+
|
|
65
|
+
This method extends the base implementation to inject Revenium
|
|
66
|
+
usage metadata while preserving all other functionality.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
prompt_stack: The prompt stack for the request
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Parameters dictionary for the Anthropic API call
|
|
73
|
+
"""
|
|
74
|
+
# Get the base parameters from the parent class
|
|
75
|
+
params = super()._base_params(prompt_stack)
|
|
76
|
+
|
|
77
|
+
# Only inject metadata if middleware is available and we have metadata
|
|
78
|
+
if MIDDLEWARE_AVAILABLE and self.usage_metadata:
|
|
79
|
+
# Copy only business metadata; auth credentials are excluded to
|
|
80
|
+
# prevent corruption of the middleware's authentication state.
|
|
81
|
+
clean_metadata = strip_revenium_auth_keys(self.usage_metadata)
|
|
82
|
+
if clean_metadata:
|
|
83
|
+
# Inject the clean metadata directly into the API call parameters
|
|
84
|
+
params['usage_metadata'] = clean_metadata
|
|
85
|
+
logger.debug(f"Injected usage metadata: {list(clean_metadata.keys())}")
|
|
86
|
+
|
|
87
|
+
return params
|