diff --git a/docs/_sidebar.md b/docs/_sidebar.md index aef6cd18..bb6a247f 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -74,6 +74,7 @@ - [GCP Vertex AI](/modules/retrieval/text_embedding/integrations/gcp_vertex_ai.md) - [Ollama](/modules/retrieval/text_embedding/integrations/ollama.md) - [Mistral AI](/modules/retrieval/text_embedding/integrations/mistralai.md) + - [Together AI](/modules/retrieval/text_embedding/integrations/together_ai.md) - [Prem App](/modules/retrieval/text_embedding/integrations/prem.md) - [Vector stores](/modules/retrieval/vector_stores/vector_stores.md) - Integrations diff --git a/docs/modules/retrieval/text_embedding/integrations/openai.md b/docs/modules/retrieval/text_embedding/integrations/openai.md index a5be87d9..4f4d0ebf 100644 --- a/docs/modules/retrieval/text_embedding/integrations/openai.md +++ b/docs/modules/retrieval/text_embedding/integrations/openai.md @@ -1,11 +1,22 @@ -# OpenAI +# OpenAIEmbeddings -Let's load the OpenAI Embedding class. +You can use the `OpenAIEmbeddings` wrapper to consume OpenAI embedding models. ```dart -final openaiApiKey = Platform.environment['OPENAI_API_KEY']; -final embeddings = OpenAIEmbeddings(apiKey: openaiApiKey); -const text = 'This is a test document.'; -final res = await embeddings.embedQuery(text); -final res = await embeddings.embedDocuments([text]); +final openAiApiKey = Platform.environment['OPENAI_API_KEY']; +final embeddings = OpenAIEmbeddings(apiKey: openAiApiKey); + +// Embedding a document +const doc = Document(pageContent: 'This is a test document.'); +final res1 = await embeddings.embedDocuments([doc]); +print(res1); +// [[-0.003105443, 0.011136302, -0.0040295827, -0.011749065, ...]] + +// Embedding a retrieval query +const text = 'This is a test query.'; +final res2 = await embeddings.embedQuery(text); +print(res2); +// [-0.005047946, 0.0050882488, -0.0051957234, -0.019143905, ...] + +embeddings.close(); ``` diff --git a/docs/modules/retrieval/text_embedding/integrations/together_ai.md b/docs/modules/retrieval/text_embedding/integrations/together_ai.md new file mode 100644 index 00000000..15e42548 --- /dev/null +++ b/docs/modules/retrieval/text_embedding/integrations/together_ai.md @@ -0,0 +1,30 @@ +# Together AI Embeddings + +[Together AI](https://www.together.ai/) offers several leading [embedding models](https://docs.together.ai/docs/embedding-models#embedding-models) through its OpenAI compatible API. + +You can consume Together AI API using the `OpenAIEmbeddings` wrapper in the same way you would use the OpenAI API. + +The only difference is that you need to change the base URL to `https://api.together.xyz/v1`: + +```dart +final togetherAiApiKey = Platform.environment['TOGETHER_AI_API_KEY']; +final embeddings = OpenAIEmbeddings( + apiKey: togetherAiApiKey, + baseUrl: 'https://api.together.xyz/v1', + model: 'togethercomputer/m2-bert-80M-32k-retrieval', +); + +// Embedding a document +const doc = Document(pageContent: 'This is a test document.'); +final res1 = await embeddings.embedDocuments([doc]); +print(res1); +// [[-0.038838703, 0.0580902, 0.022614542, 0.0078403875, ...]] + +// Embedding a retrieval query +const text = 'This is a test query.'; +final res2 = await embeddings.embedQuery(text); +print(res2); +// [-0.019722218, 0.04656633, -0.0074559706, 0.005712764, ...] + +embeddings.close(); +``` diff --git a/examples/docs_examples/bin/modules/retrieval/text_embedding/integrations/openai.dart b/examples/docs_examples/bin/modules/retrieval/text_embedding/integrations/openai.dart new file mode 100644 index 00000000..646465f1 --- /dev/null +++ b/examples/docs_examples/bin/modules/retrieval/text_embedding/integrations/openai.dart @@ -0,0 +1,24 @@ +// ignore_for_file: avoid_print +import 'dart:io'; + +import 'package:langchain/langchain.dart'; +import 'package:langchain_openai/langchain_openai.dart'; + +void main(final List arguments) async { + final openAiApiKey = Platform.environment['OPENAI_API_KEY']; + final embeddings = OpenAIEmbeddings(apiKey: openAiApiKey); + + // Embedding a document + const doc = Document(pageContent: 'This is a test document.'); + final res1 = await embeddings.embedDocuments([doc]); + print(res1); + // [[-0.003105443, 0.011136302, -0.0040295827, -0.011749065, ...]] + + // Embedding a retrieval query + const text = 'This is a test query.'; + final res2 = await embeddings.embedQuery(text); + print(res2); + // [-0.005047946, 0.0050882488, -0.0051957234, -0.019143905, ...] + + embeddings.close(); +} diff --git a/examples/docs_examples/bin/modules/retrieval/text_embedding/integrations/together_ai.dart b/examples/docs_examples/bin/modules/retrieval/text_embedding/integrations/together_ai.dart new file mode 100644 index 00000000..1e3ecdb2 --- /dev/null +++ b/examples/docs_examples/bin/modules/retrieval/text_embedding/integrations/together_ai.dart @@ -0,0 +1,28 @@ +// ignore_for_file: avoid_print +import 'dart:io'; + +import 'package:langchain/langchain.dart'; +import 'package:langchain_openai/langchain_openai.dart'; + +void main(final List arguments) async { + final togetherAiApiKey = Platform.environment['TOGETHER_AI_API_KEY']; + final embeddings = OpenAIEmbeddings( + apiKey: togetherAiApiKey, + baseUrl: 'https://api.together.xyz/v1', + model: 'togethercomputer/m2-bert-80M-32k-retrieval', + ); + + // Embedding a document + const doc = Document(pageContent: 'This is a test document.'); + final res1 = await embeddings.embedDocuments([doc]); + print(res1); + // [[-0.038838703, 0.0580902, 0.022614542, 0.0078403875, ...]] + + // Embedding a retrieval query + const text = 'This is a test query.'; + final res2 = await embeddings.embedQuery(text); + print(res2); + // [-0.019722218, 0.04656633, -0.0074559706, 0.005712764, ...] + + embeddings.close(); +} diff --git a/packages/langchain_openai/lib/src/embeddings/openai.dart b/packages/langchain_openai/lib/src/embeddings/openai.dart index cd905ad5..936a55fb 100644 --- a/packages/langchain_openai/lib/src/embeddings/openai.dart +++ b/packages/langchain_openai/lib/src/embeddings/openai.dart @@ -13,6 +13,8 @@ import 'package:openai_dart/openai_dart.dart'; /// - [Embeddings guide](https://platform.openai.com/docs/guides/embeddings/limitations-risks) /// - [Embeddings API docs](https://platform.openai.com/docs/api-reference/embeddings) /// +/// You can also use this wrapper to consume OpenAI-compatible APIs like [Together AI](https://www.together.ai). +/// /// ### Authentication /// /// The OpenAI API uses API keys for authentication. Visit your @@ -122,7 +124,7 @@ class OpenAIEmbeddings implements Embeddings { OpenAIEmbeddings({ final String? apiKey, final String? organization, - final String? baseUrl, + final String baseUrl = 'https://api.openai.com/v1', final Map? headers, final Map? queryParams, final http.Client? client, @@ -199,4 +201,9 @@ class OpenAIEmbeddings implements Embeddings { ); return data.data.first.embeddingVector; } + + /// Closes the client and cleans up any resources associated with it. + void close() { + _client.endSession(); + } } diff --git a/packages/langchain_openai/test/embeddings/openai_test.dart b/packages/langchain_openai/test/embeddings/openai_embeddings_test.dart similarity index 100% rename from packages/langchain_openai/test/embeddings/openai_test.dart rename to packages/langchain_openai/test/embeddings/openai_embeddings_test.dart diff --git a/packages/langchain_openai/test/embeddings/together_ai_embeddings_test.dart b/packages/langchain_openai/test/embeddings/together_ai_embeddings_test.dart new file mode 100644 index 00000000..74833e82 --- /dev/null +++ b/packages/langchain_openai/test/embeddings/together_ai_embeddings_test.dart @@ -0,0 +1,43 @@ +@TestOn('vm') +library; // Uses dart:io + +import 'dart:io'; + +import 'package:langchain_openai/langchain_openai.dart'; +import 'package:test/test.dart'; + +void main() { + group('Together AI Embeddings tests', () { + late OpenAIEmbeddings embeddings; + + setUp(() async { + embeddings = OpenAIEmbeddings( + apiKey: Platform.environment['TOGETHER_AI_API_KEY'], + baseUrl: 'https://api.together.xyz/v1', + ); + }); + + tearDown(() { + embeddings.close(); + }); + + test('Test AI Embeddings models', () async { + final models = [ + 'togethercomputer/m2-bert-80M-2k-retrieval', + 'togethercomputer/m2-bert-80M-8k-retrieval', + 'togethercomputer/m2-bert-80M-32k-retrieval', + 'WhereIsAI/UAE-Large-V1', + 'BAAI/bge-large-en-v1.5', + 'BAAI/bge-base-en-v1.5', + 'sentence-transformers/msmarco-bert-base-dot-v5', + 'bert-base-uncased', + ]; + for (final model in models) { + embeddings.model = model; + final res = await embeddings.embedQuery('Hello world'); + expect(res.length, greaterThan(0)); + await Future.delayed(const Duration(seconds: 1)); // Rate limit + } + }); + }); +}