diff --git a/Cargo.lock b/Cargo.lock index f40aa7189..5a6739921 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -902,6 +902,31 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bon" +version = "3.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f61138465baf186c63e8d9b6b613b508cd832cba4ce93cf37ce5f096f91ac1a6" +dependencies = [ + "bon-macros", + "rustversion", +] + +[[package]] +name = "bon-macros" +version = "3.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40d1dad34aa19bf02295382f08d9bc40651585bd497266831d40ee6296fb49ca" +dependencies = [ + "darling", + "ident_case", + "prettyplease", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.104", +] + [[package]] name = "bstr" version = "1.12.0" @@ -1066,6 +1091,7 @@ dependencies = [ "env_logger", "futures", "globset", + "google-cloud-aiplatform-v1", "google-drive3", "hex", "http-body-util", @@ -1912,6 +1938,222 @@ dependencies = [ "yup-oauth2 11.0.0", ] +[[package]] +name = "google-cloud-aiplatform-v1" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "571ef9524283a5973d4fc790ec4aa1f6d8c141c71e4b372e95ccb32ebb00b87f" +dependencies = [ + "async-trait", + "bytes", + "google-cloud-api", + "google-cloud-gax", + "google-cloud-gax-internal", + "google-cloud-iam-v1", + "google-cloud-location", + "google-cloud-longrunning", + "google-cloud-lro", + "google-cloud-rpc", + "google-cloud-type", + "google-cloud-wkt", + "lazy_static", + "reqwest", + "serde", + "serde_json", + "serde_with", + "tracing", +] + +[[package]] +name = "google-cloud-api" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b110420309adc187bf99c53bf698520bbf707fa56b76d1d47c8de9b00c7529d2" +dependencies = [ + "bytes", + "google-cloud-wkt", + "serde", + "serde_json", + "serde_with", +] + +[[package]] +name = "google-cloud-auth" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65fb515e1e726bc58b925fc876e8f02b626ab574b15c8f3fa53cb08177a7815" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bon", + "google-cloud-gax", + "http 1.3.1", + "reqwest", + "rustls 0.23.29", + "rustls-pemfile 2.2.0", + "serde", + "serde_json", + "thiserror 2.0.12", + "time", + "tokio", +] + +[[package]] +name = "google-cloud-gax" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d88f66b6fccca3449ad9f0366ec3d1b74a004fa1100d98353a201dabc3203bd2" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures", + "google-cloud-rpc", + "google-cloud-wkt", + "http 1.3.1", + "pin-project", + "rand 0.9.1", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", +] + +[[package]] +name = "google-cloud-gax-internal" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8291536f9608037835925d9d8e54dab3a74abaca59d42dbcb8dc6cfc5e35066a" +dependencies = [ + "bytes", + "google-cloud-auth", + "google-cloud-gax", + "google-cloud-rpc", + "http 1.3.1", + "http-body-util", + "percent-encoding", + "reqwest", + "rustc_version", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", +] + +[[package]] +name = "google-cloud-iam-v1" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d75747af3509772c2526cf3328e4542203318e0351f29280c5e439dfb00702" +dependencies = [ + "async-trait", + "bytes", + "google-cloud-gax", + "google-cloud-gax-internal", + "google-cloud-type", + "google-cloud-wkt", + "lazy_static", + "reqwest", + "serde", + "serde_json", + "serde_with", + "tracing", +] + +[[package]] +name = "google-cloud-location" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e50a61d6b6b35faebeecf91bc8c4fc5f63a362d877d2568a01fce6131d2ba24" +dependencies = [ + "async-trait", + "bytes", + "google-cloud-gax", + "google-cloud-gax-internal", + "google-cloud-wkt", + "lazy_static", + "reqwest", + "serde", + "serde_json", + "serde_with", + "tracing", +] + +[[package]] +name = "google-cloud-longrunning" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc29656e6916ffbd835d54eafa163aab45232b7dde648a265efb123c078cec7d" +dependencies = [ + "async-trait", + "bytes", + "google-cloud-gax", + "google-cloud-gax-internal", + "google-cloud-rpc", + "google-cloud-wkt", + "lazy_static", + "reqwest", + "serde", + "serde_json", + "serde_with", + "tracing", +] + +[[package]] +name = "google-cloud-lro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5325b6cf7bac79e9ec87ae6806d619d8fbf4b345a1223ede93fa87d99b9df41a" +dependencies = [ + "google-cloud-gax", + "google-cloud-longrunning", + "google-cloud-rpc", + "google-cloud-wkt", + "serde", + "tokio", +] + +[[package]] +name = "google-cloud-rpc" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b4b7867ab6e94e56944116f2b1bdcdbac522eea794743a9884d84db7728470" +dependencies = [ + "bytes", + "google-cloud-wkt", + "serde", + "serde_json", + "serde_with", +] + +[[package]] +name = "google-cloud-type" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683af2d05d271b6d0a13bcba997037885d8369f850706473576d5e257fac3f62" +dependencies = [ + "bytes", + "google-cloud-wkt", + "serde", + "serde_json", + "serde_with", +] + +[[package]] +name = "google-cloud-wkt" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b1dbeb30ab8bde2423081b76f9c302d82fea1b99f8ca750f223d32065d3c6c" +dependencies = [ + "base64 0.22.1", + "bytes", + "serde", + "serde_json", + "serde_with", + "thiserror 2.0.12", + "time", + "url", +] + [[package]] name = "google-drive3" version = "6.0.0+20240618" diff --git a/Cargo.toml b/Cargo.toml index 4f439b1ab..803c378a6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -117,3 +117,4 @@ aws-sdk-sqs = "1.67.0" numpy = "0.25.0" infer = "0.19.0" serde_with = { version = "3.13.0", features = ["base64"] } +google-cloud-aiplatform-v1 = "0.4.0" diff --git a/README.md b/README.md index 8535c3ffe..3b52c2f46 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Ultra performant data transformation framework for AI, with core engine written -CocoIndex makes it super easy to transform data with AI workloads, and keep source data and target in sync effortlessly. +CocoIndex makes it super easy to transform data with AI workloads, and keep source data and target in sync effortlessly. @@ -39,7 +39,7 @@ CocoIndex makes it super easy to transform data with AI workloads, and keep sour -Either creating embedding, building knowledge graphs, or any data transformations - beyond traditional SQL. +Either creating embedding, building knowledge graphs, or any data transformations - beyond traditional SQL. ## Exceptional velocity Just declare transformation in dataflow with ~100 lines of python @@ -65,7 +65,7 @@ CocoIndex follows the idea of [Dataflow](https://en.wikipedia.org/wiki/Dataflow_ **Particularly**, developers don't explicitly mutate data by creating, updating and deleting. They just need to define transformation/formula for a set of source data. ## Build like LEGO -Native builtins for different source, targets and transformations. Standardize interface, make it 1-line code switch between different components. +Native builtins for different source, targets and transformations. Standardize interface, make it 1-line code switch between different components.
diff --git a/python/cocoindex/__init__.py b/python/cocoindex/__init__.py
index f2730424e..41cbb3320 100644
--- a/python/cocoindex/__init__.py
+++ b/python/cocoindex/__init__.py
@@ -33,6 +33,7 @@
# Submodules
"_engine",
"functions",
+ "llm",
"sources",
"targets",
"storages",
diff --git a/python/cocoindex/functions.py b/python/cocoindex/functions.py
index 2b9ae1802..877c83e82 100644
--- a/python/cocoindex/functions.py
+++ b/python/cocoindex/functions.py
@@ -45,6 +45,7 @@ class EmbedText(op.FunctionSpec):
address: str | None = None
output_dimension: int | None = None
task_type: str | None = None
+ api_config: llm.VertexAiConfig | None = None
class ExtractByLlm(op.FunctionSpec):
diff --git a/python/cocoindex/llm.py b/python/cocoindex/llm.py
index 6a77e93e8..28ffca5fe 100644
--- a/python/cocoindex/llm.py
+++ b/python/cocoindex/llm.py
@@ -8,6 +8,7 @@ class LlmApiType(Enum):
OPENAI = "OpenAi"
OLLAMA = "Ollama"
GEMINI = "Gemini"
+ VERTEX_AI = "VertexAi"
ANTHROPIC = "Anthropic"
LITE_LLM = "LiteLlm"
OPEN_ROUTER = "OpenRouter"
@@ -15,6 +16,16 @@ class LlmApiType(Enum):
VLLM = "Vllm"
+@dataclass
+class VertexAiConfig:
+ """A specification for a Vertex AI LLM."""
+
+ kind = "VertexAi"
+
+ project: str
+ region: str | None = None
+
+
@dataclass
class LlmSpec:
"""A specification for a LLM."""
@@ -22,3 +33,4 @@ class LlmSpec:
api_type: LlmApiType
model: str
address: str | None = None
+ api_config: VertexAiConfig | None = None
diff --git a/src/llm/gemini.rs b/src/llm/gemini.rs
index 17ec63041..1eb869749 100644
--- a/src/llm/gemini.rs
+++ b/src/llm/gemini.rs
@@ -5,6 +5,7 @@ use crate::llm::{
ToJsonSchemaOptions, detect_image_mime_type,
};
use base64::prelude::*;
+use google_cloud_aiplatform_v1 as vertexai;
use phf::phf_map;
use serde_json::Value;
use urlencoding::encode;
@@ -15,12 +16,12 @@ static DEFAULT_EMBEDDING_DIMENSIONS: phf::Map<&str, u32> = phf_map! {
"embedding-001" => 768,
};
-pub struct Client {
+pub struct AiStudioClient {
api_key: String,
client: reqwest::Client,
}
-impl Client {
+impl AiStudioClient {
pub fn new(address: Option