-
Notifications
You must be signed in to change notification settings - Fork 260
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Add Voyage AI support #575
Changes from 1 commit
f065f50
7cf6400
2701eaf
ae686a7
2255c54
bd25d3b
2f6a5f6
c653de8
11b83e2
9288655
d623a4a
b2adfe9
f694d69
56f3fea
ad922f8
7bc41e6
3a2d13e
9233e21
4965dc3
92a6f24
1168ff0
420006a
8315987
033a29b
1322010
c3277d8
413ee42
ff5df30
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
Co-Authored-By: Alex Reibman <[email protected]>
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,168 +1,116 @@ | ||
import sys | ||
import warnings | ||
import nbformat as nbf | ||
|
||
# Create a new notebook | ||
nb = nbf.v4.new_notebook() | ||
|
||
def create_voyage_example(): | ||
if sys.version_info < (3, 9): | ||
warnings.warn("Voyage AI SDK requires Python >=3.9. Example may not work correctly.") | ||
|
||
# Create a new notebook | ||
nb = nbf.v4.new_notebook() | ||
|
||
# Add metadata | ||
nb.metadata = { | ||
"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, | ||
"language_info": { | ||
"codemirror_mode": {"name": "ipython", "version": 3}, | ||
"file_extension": ".py", | ||
"mimetype": "text/x-python", | ||
"name": "python", | ||
"nbconvert_exporter": "python", | ||
"pygments_lexer": "ipython3", | ||
"version": "3.9.0", | ||
}, | ||
} | ||
|
||
# Add introduction | ||
nb.cells.append( | ||
nbf.v4.new_markdown_cell( | ||
"""# Voyage AI Integration Example | ||
# Add markdown cell explaining the notebook | ||
nb.cells.append( | ||
nbf.v4.new_markdown_cell( | ||
"""# Voyage AI Integration Example with AgentOps | ||
|
||
This notebook demonstrates how to use the Voyage AI provider with AgentOps for embedding operations. The integration supports both synchronous and asynchronous operations, includes token usage tracking, and provides proper error handling. | ||
|
||
## Requirements | ||
- Python >= 3.9 (Voyage AI SDK requirement) | ||
- AgentOps library | ||
- Voyage AI API key""" | ||
) | ||
) | ||
) | ||
|
||
# Add setup code | ||
nb.cells.append( | ||
nbf.v4.new_code_cell( | ||
"""import os | ||
# Add cell for imports and setup | ||
nb.cells.append( | ||
nbf.v4.new_code_cell( | ||
"""import os | ||
import asyncio | ||
import agentops | ||
import voyageai | ||
from agentops.llms.providers.voyage import VoyageProvider | ||
|
||
# Set up your Voyage AI API key | ||
os.environ["VOYAGE_API_KEY"] = "your-api-key-here\"""" | ||
) | ||
) | ||
|
||
# Add provider initialization | ||
nb.cells.append( | ||
nbf.v4.new_markdown_cell( | ||
"""## Initialize Voyage AI Provider | ||
# Set up AgentOps client with development key | ||
os.environ["AGENTOPS_API_KEY"] = "8b95388c-ee56-499d-a940-c1d6a2ba7f0c" | ||
ao_client = agentops.Client() | ||
|
||
First, we'll create a Voyage AI client and initialize the provider:""" | ||
) | ||
) | ||
# Initialize AgentOps client and start session | ||
session = ao_client.initialize() | ||
if session is None: | ||
print("Failed to initialize AgentOps client") | ||
raise RuntimeError("AgentOps client initialization failed") | ||
|
||
nb.cells.append( | ||
nbf.v4.new_code_cell( | ||
"""# Initialize Voyage client and provider | ||
voyage_client = voyageai.Client() | ||
provider = VoyageProvider(voyage_client) | ||
# Set up Voyage AI client (requires API key) | ||
if "VOYAGE_API_KEY" not in os.environ: | ||
print("Warning: VOYAGE_API_KEY not set. Using placeholder key for demonstration.") | ||
os.environ["VOYAGE_API_KEY"] = "your-api-key-here" | ||
|
||
print("Provider initialized successfully!")""" | ||
) | ||
) | ||
|
||
# Add basic embedding example | ||
nb.cells.append( | ||
nbf.v4.new_markdown_cell( | ||
"""## Basic Embedding Operation | ||
try: | ||
voyage_client = voyageai.Client() | ||
provider = VoyageProvider(voyage_client) | ||
print("Successfully initialized Voyage AI provider") | ||
except Exception as e: | ||
print(f"Failed to initialize Voyage AI provider: {e}") | ||
raise | ||
|
||
Let's create embeddings for some example text and examine the token usage:""" | ||
) | ||
print(f"AgentOps Session URL: {session.session_url}")""" | ||
) | ||
) | ||
|
||
nb.cells.append( | ||
nbf.v4.new_code_cell( | ||
"""# Example text for embedding | ||
# Add cell for basic embedding | ||
nb.cells.append( | ||
nbf.v4.new_code_cell( | ||
"""# Example text for embedding | ||
text = "The quick brown fox jumps over the lazy dog." | ||
|
||
# Generate embeddings | ||
result = provider.embed(text) | ||
|
||
print(f"Embedding dimension: {len(result['embeddings'][0])}") | ||
print(f"Token usage: {result['usage']}")""" | ||
) | ||
) | ||
|
||
# Add async embedding example | ||
nb.cells.append( | ||
nbf.v4.new_markdown_cell( | ||
"""## Asynchronous Embedding | ||
|
||
The provider also supports asynchronous operations for better performance when handling multiple requests:""" | ||
) | ||
try: | ||
# Generate embeddings with session tracking | ||
result = provider.embed(text, session=session) | ||
print(f"Embedding dimension: {len(result['embeddings'][0])}") | ||
print(f"Token usage: {result['usage']}") | ||
except Exception as e: | ||
print(f"Failed to generate embeddings: {e}") | ||
raise""" | ||
) | ||
) | ||
|
||
nb.cells.append( | ||
nbf.v4.new_code_cell( | ||
"""async def process_multiple_texts(): | ||
# Add cell for async embedding | ||
nb.cells.append( | ||
nbf.v4.new_code_cell( | ||
"""async def process_multiple_texts(): | ||
texts = [ | ||
"First example text", | ||
"Second example text", | ||
"Third example text" | ||
] | ||
|
||
# Process texts concurrently | ||
tasks = [provider.aembed(text) for text in texts] | ||
results = await asyncio.gather(*tasks) | ||
|
||
return results | ||
|
||
# Run async example | ||
results = await process_multiple_texts() | ||
try: | ||
# Process texts concurrently with session tracking | ||
tasks = [provider.aembed(text, session=session) for text in texts] | ||
results = await asyncio.gather(*tasks) | ||
|
||
# Display results | ||
for i, result in enumerate(results, 1): | ||
print(f"\\nText {i}:") | ||
print(f"Embedding dimension: {len(result['embeddings'][0])}") | ||
print(f"Token usage: {result['usage']}")""" | ||
) | ||
) | ||
# Display results | ||
for i, result in enumerate(results, 1): | ||
print(f"\\nText {i}:") | ||
print(f"Embedding dimension: {len(result['embeddings'][0])}") | ||
print(f"Token usage: {result['usage']}") | ||
|
||
# Add error handling example | ||
nb.cells.append( | ||
nbf.v4.new_markdown_cell( | ||
"""## Error Handling | ||
return results | ||
except Exception as e: | ||
print(f"Failed to process texts: {e}") | ||
raise | ||
|
||
The provider includes proper error handling for various scenarios:""" | ||
) | ||
# Run async example | ||
results = await process_multiple_texts()""" | ||
) | ||
) | ||
|
||
nb.cells.append( | ||
nbf.v4.new_code_cell( | ||
"""# Example: Handle invalid input | ||
try: | ||
result = provider.embed(None) | ||
except ValueError as e: | ||
print(f"Caught ValueError: {e}") | ||
|
||
# Example: Handle API errors | ||
try: | ||
# Temporarily set invalid API key | ||
os.environ["VOYAGE_API_KEY"] = "invalid-key" | ||
new_client = voyageai.Client() | ||
new_provider = VoyageProvider(new_client) | ||
result = new_provider.embed("test") | ||
except Exception as e: | ||
print(f"Caught API error: {e}") | ||
finally: | ||
# Restore original API key | ||
os.environ["VOYAGE_API_KEY"] = "your-api-key-here\"""" | ||
) | ||
# Add cell for cleanup | ||
nb.cells.append( | ||
nbf.v4.new_code_cell( | ||
"""# End the session | ||
ao_client.end_session("Success", "Example notebook completed successfully")""" | ||
) | ||
) | ||
|
||
# Save the notebook | ||
with open("/home/ubuntu/repos/agentops/examples/voyage/voyage_example.ipynb", "w") as f: | ||
nbf.write(nb, f) | ||
|
||
# Write the notebook | ||
with open("voyage_example.ipynb", "w") as f: | ||
nbf.write(nb, f) | ||
|
||
if __name__ == "__main__": | ||
create_voyage_example() | ||
print("Notebook created successfully!") |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
import nbformat | ||
from nbconvert.preprocessors import ExecutePreprocessor | ||
import os | ||
|
||
|
||
def run_notebook(): | ||
# Load the notebook | ||
notebook_path = os.path.join(os.path.dirname(__file__), "voyage_example.ipynb") | ||
|
||
with open(notebook_path) as f: | ||
nb = nbformat.read(f, as_version=4) | ||
|
||
# Configure the notebook executor | ||
ep = ExecutePreprocessor(timeout=600, kernel_name="python3") | ||
|
||
try: | ||
# Execute the notebook | ||
ep.preprocess(nb, {"metadata": {"path": os.path.dirname(os.path.abspath(__file__))}}) | ||
|
||
# Save the executed notebook | ||
with open(notebook_path, "w", encoding="utf-8") as f: | ||
nbformat.write(nb, f) | ||
|
||
print("Notebook executed successfully!") | ||
|
||
except Exception as e: | ||
print(f"Error executing notebook: {str(e)}") | ||
raise | ||
|
||
|
||
if __name__ == "__main__": | ||
run_notebook() |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,66 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
#!/usr/bin/env python | ||||||||||||||||||||||||||||||||||||||||||||||||||||
# coding: utf-8 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
# # Voyage AI Integration Example with AgentOps | ||||||||||||||||||||||||||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||||||||||||||||||||||||||
# This notebook demonstrates how to use the Voyage AI provider with AgentOps for embedding operations using a mock client for demonstration purposes. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
import os | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import json | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import asyncio | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from voyageai import Client as VoyageClient | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from agentops import Client as AgentopsClient | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from agentops.llms.providers.voyage import VoyageProvider | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
class MockVoyageClient: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
def embed(self, texts, **kwargs): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
"data": [{"embedding": [0.1] * 1024, "index": 0, "object": "embedding"}], | ||||||||||||||||||||||||||||||||||||||||||||||||||||
"model": "voyage-01", | ||||||||||||||||||||||||||||||||||||||||||||||||||||
"object": "list", | ||||||||||||||||||||||||||||||||||||||||||||||||||||
"usage": {"prompt_tokens": 10, "completion_tokens": 0}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
async def aembed(self, texts, **kwargs): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return self.embed(texts, **kwargs) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
def main(): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
# Set AgentOps API key | ||||||||||||||||||||||||||||||||||||||||||||||||||||
os.environ["AGENTOPS_API_KEY"] = "8b95388c-ee56-499d-a940-c1d6a2ba7f0c" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
# Initialize clients | ||||||||||||||||||||||||||||||||||||||||||||||||||||
voyage_client = MockVoyageClient() | ||||||||||||||||||||||||||||||||||||||||||||||||||||
ao_client = AgentopsClient() | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
# Initialize session | ||||||||||||||||||||||||||||||||||||||||||||||||||||
session = ao_client.initialize() | ||||||||||||||||||||||||||||||||||||||||||||||||||||
print(f"Session URL: {session.session_url}") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🤖 Bug Fix: 🔧 Suggested Code Diff: -def main():
- # Set AgentOps API key
- os.environ["AGENTOPS_API_KEY"] = "8b95388c-ee56-499d-a940-c1d6a2ba7f0c"
+def main():
+ # Retrieve AgentOps API key from environment variable
+ api_key = os.environ.get("AGENTOPS_API_KEY")
+ if not api_key:
+ raise ValueError("AGENTOPS_API_KEY environment variable not set")
+ os.environ["AGENTOPS_API_KEY"] = api_key
# Initialize clients
voyage_client = MockVoyageClient()
ao_client = AgentopsClient() 📝 Committable Code Suggestion
Suggested change
📜 GuidelinesPython: Avoid mutable global states |
||||||||||||||||||||||||||||||||||||||||||||||||||||
# Set up Voyage provider with mock client | ||||||||||||||||||||||||||||||||||||||||||||||||||||
provider = VoyageProvider(client=voyage_client) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
provider.override() | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
# Create embeddings with session tracking | ||||||||||||||||||||||||||||||||||||||||||||||||||||
text = "Hello, Voyage!" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
result = provider.embed(text, session=session) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
print(f"\nEmbedding dimension: {len(result['data'][0]['embedding'])}") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
# Print event data for verification | ||||||||||||||||||||||||||||||||||||||||||||||||||||
events = session.get_events() | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if events: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
latest_event = events[-1] | ||||||||||||||||||||||||||||||||||||||||||||||||||||
print("\nLatest Event Data:") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
print(json.dumps(latest_event, indent=2)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
finally: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
# Clean up provider override | ||||||||||||||||||||||||||||||||||||||||||||||||||||
provider.undo_override() | ||||||||||||||||||||||||||||||||||||||||||||||||||||
# End session | ||||||||||||||||||||||||||||||||||||||||||||||||||||
ao_client.end_session("Success", "Example completed successfully") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
print(f"\nSession ended. View session at: {session.session_url}") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if __name__ == "__main__": | ||||||||||||||||||||||||||||||||||||||||||||||||||||
main() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 Bug Fix:
Avoid Hardcoding API Keys
Hardcoding API keys directly in the code poses a significant security risk. It can lead to unauthorized access if the code is exposed in version control or logs.
os.environ
or a secure configuration management tool.🔧 Suggested Code Diff:
📝 Committable Code Suggestion
📜 Guidelines