euriai 1.0.15__tar.gz → 1.0.16__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: euriai
3
- Version: 1.0.15
3
+ Version: 1.0.16
4
4
  Summary: Python client for Euri API (euron.one) with CLI, LangChain, and LlamaIndex integration
5
5
  Author: Euri
6
6
  Author-email: tech@euron.one
@@ -1,204 +1,204 @@
1
- """
2
- Euri AI Python SDK
3
-
4
- A comprehensive Python SDK for the Euri AI API with integrations for popular frameworks.
5
- """
6
-
7
- __version__ = "1.0.15"
8
-
9
- # Core imports that should always work
10
- try:
11
- from .client import EuriaiClient
12
- except ImportError as e:
13
- print(f"Warning: Could not import EuriaiClient: {e}")
14
- EuriaiClient = None
15
-
16
- try:
17
- from .embedding import EuriaiEmbeddingClient
18
- # Backward compatibility alias
19
- EuriaiEmbedding = EuriaiEmbeddingClient
20
- except ImportError as e:
21
- print(f"Warning: Could not import EuriaiEmbeddingClient: {e}")
22
- EuriaiEmbeddingClient = None
23
- EuriaiEmbedding = None
24
-
25
- # Main exports (only include what was successfully imported)
26
- __all__ = []
27
- if EuriaiClient is not None:
28
- __all__.append("EuriaiClient")
29
- if EuriaiEmbeddingClient is not None:
30
- __all__.extend(["EuriaiEmbeddingClient", "EuriaiEmbedding"])
31
-
32
-
33
- # Helper functions for optional dependencies
34
- def check_optional_dependency(package_name: str, integration_name: str, install_extra: str = None) -> bool:
35
- """
36
- Check if an optional dependency is installed and provide helpful installation instructions.
37
-
38
- Args:
39
- package_name: The actual package name to import
40
- integration_name: The friendly name for the integration
41
- install_extra: The extras_require key for pip install euriai[extra]
42
-
43
- Returns:
44
- bool: True if package is available, False otherwise
45
-
46
- Raises:
47
- ImportError: With helpful installation instructions
48
- """
49
- try:
50
- __import__(package_name)
51
- return True
52
- except ImportError:
53
- extra_option = f"euriai[{install_extra}]" if install_extra else f"euriai[{integration_name.lower()}]"
54
-
55
- error_msg = (
56
- f"{integration_name} is not installed. Please install it using one of these methods:\n\n"
57
- f"Option 1 (Recommended): Install with euriai extras:\n"
58
- f" pip install {extra_option}\n\n"
59
- f"Option 2: Install {integration_name} directly:\n"
60
- f" pip install {package_name}\n\n"
61
- f"Option 3: Install all euriai integrations:\n"
62
- f" pip install euriai[all]\n"
63
- )
64
-
65
- raise ImportError(error_msg)
66
-
67
-
68
- def install_optional_dependency(package_name: str, integration_name: str, install_extra: str = None) -> bool:
69
- """
70
- Attempt to automatically install an optional dependency (USE WITH CAUTION).
71
-
72
- This function is provided for convenience but automatic installation can be risky.
73
- It's generally better to install dependencies manually.
74
-
75
- Args:
76
- package_name: The actual package name to install
77
- integration_name: The friendly name for the integration
78
- install_extra: The extras_require key for pip install euriai[extra]
79
-
80
- Returns:
81
- bool: True if installation succeeded, False otherwise
82
- """
83
- import subprocess
84
- import sys
85
-
86
- try:
87
- # Try to import first
88
- __import__(package_name)
89
- print(f"✓ {integration_name} is already installed")
90
- return True
91
- except ImportError:
92
- pass
93
-
94
- # Ask user for confirmation
95
- extra_option = f"euriai[{install_extra}]" if install_extra else f"euriai[{integration_name.lower()}]"
96
-
97
- print(f"🔍 {integration_name} is not installed.")
98
- print(f"📦 Recommended installation: pip install {extra_option}")
99
-
100
- response = input(f"Would you like to automatically install {package_name}? (y/N): ").lower()
101
-
102
- if response in ['y', 'yes']:
103
- try:
104
- print(f"📥 Installing {package_name}...")
105
- subprocess.check_call([sys.executable, "-m", "pip", "install", package_name])
106
- print(f"✅ {integration_name} installed successfully!")
107
- return True
108
- except subprocess.CalledProcessError as e:
109
- print(f"❌ Failed to install {package_name}: {e}")
110
- print(f"💡 Try manually: pip install {extra_option}")
111
- return False
112
- else:
113
- print(f"💡 To install manually run: pip install {extra_option}")
114
- return False
115
-
116
-
117
- # Lazy loading functions for optional integrations
118
- def _get_langchain():
119
- """Lazy import for LangChain integration."""
120
- try:
121
- from . import langchain
122
- return langchain
123
- except ImportError:
124
- check_optional_dependency("langchain-core", "LangChain", "langchain")
125
-
126
- def _get_crewai():
127
- """Lazy import for CrewAI integration."""
128
- try:
129
- from . import crewai
130
- return crewai
131
- except ImportError:
132
- check_optional_dependency("crewai", "CrewAI", "crewai")
133
-
134
- def _get_autogen():
135
- """Lazy import for AutoGen integration."""
136
- try:
137
- from . import autogen
138
- return autogen
139
- except ImportError:
140
- check_optional_dependency("pyautogen", "AutoGen", "autogen")
141
-
142
- def _get_smolagents():
143
- """Lazy import for SmolAgents integration."""
144
- try:
145
- from . import smolagents
146
- return smolagents
147
- except ImportError:
148
- check_optional_dependency("smolagents", "SmolAgents", "smolagents")
149
-
150
- def _get_langgraph():
151
- """Lazy import for LangGraph integration."""
152
- try:
153
- from . import langgraph
154
- return langgraph
155
- except ImportError:
156
- check_optional_dependency("langgraph", "LangGraph", "langgraph")
157
-
158
- def _get_llamaindex():
159
- """Lazy import for LlamaIndex integration."""
160
- try:
161
- from . import llamaindex
162
- return llamaindex
163
- except ImportError:
164
- check_optional_dependency("llama-index", "LlamaIndex", "llama-index")
165
-
166
-
167
- # Create lazy loading properties
168
- class _LazyLoader:
169
- """Lazy loader for optional integrations."""
170
-
171
- @property
172
- def langchain(self):
173
- return _get_langchain()
174
-
175
- @property
176
- def crewai(self):
177
- return _get_crewai()
178
-
179
- @property
180
- def autogen(self):
181
- return _get_autogen()
182
-
183
- @property
184
- def smolagents(self):
185
- return _get_smolagents()
186
-
187
- @property
188
- def langgraph(self):
189
- return _get_langgraph()
190
-
191
- @property
192
- def llamaindex(self):
193
- return _get_llamaindex()
194
-
195
-
196
- # Create the lazy loader instance
197
- _lazy = _LazyLoader()
198
-
199
- # Make the integrations available as module-level attributes
200
- def __getattr__(name: str):
201
- """Handle lazy loading of optional integrations."""
202
- if hasattr(_lazy, name):
203
- return getattr(_lazy, name)
1
+ """
2
+ Euri AI Python SDK
3
+
4
+ A comprehensive Python SDK for the Euri AI API with integrations for popular frameworks.
5
+ """
6
+
7
+ __version__ = "1.0.16"
8
+
9
+ # Core imports that should always work
10
+ try:
11
+ from .client import EuriaiClient
12
+ except ImportError as e:
13
+ print(f"Warning: Could not import EuriaiClient: {e}")
14
+ EuriaiClient = None
15
+
16
+ try:
17
+ from .embedding import EuriaiEmbeddingClient
18
+ # Backward compatibility alias
19
+ EuriaiEmbedding = EuriaiEmbeddingClient
20
+ except ImportError as e:
21
+ print(f"Warning: Could not import EuriaiEmbeddingClient: {e}")
22
+ EuriaiEmbeddingClient = None
23
+ EuriaiEmbedding = None
24
+
25
+ # Main exports (only include what was successfully imported)
26
+ __all__ = []
27
+ if EuriaiClient is not None:
28
+ __all__.append("EuriaiClient")
29
+ if EuriaiEmbeddingClient is not None:
30
+ __all__.extend(["EuriaiEmbeddingClient", "EuriaiEmbedding"])
31
+
32
+
33
+ # Helper functions for optional dependencies
34
+ def check_optional_dependency(package_name: str, integration_name: str, install_extra: str = None) -> bool:
35
+ """
36
+ Check if an optional dependency is installed and provide helpful installation instructions.
37
+
38
+ Args:
39
+ package_name: The actual package name to import
40
+ integration_name: The friendly name for the integration
41
+ install_extra: The extras_require key for pip install euriai[extra]
42
+
43
+ Returns:
44
+ bool: True if package is available, False otherwise
45
+
46
+ Raises:
47
+ ImportError: With helpful installation instructions
48
+ """
49
+ try:
50
+ __import__(package_name)
51
+ return True
52
+ except ImportError:
53
+ extra_option = f"euriai[{install_extra}]" if install_extra else f"euriai[{integration_name.lower()}]"
54
+
55
+ error_msg = (
56
+ f"{integration_name} is not installed. Please install it using one of these methods:\n\n"
57
+ f"Option 1 (Recommended): Install with euriai extras:\n"
58
+ f" pip install {extra_option}\n\n"
59
+ f"Option 2: Install {integration_name} directly:\n"
60
+ f" pip install {package_name}\n\n"
61
+ f"Option 3: Install all euriai integrations:\n"
62
+ f" pip install euriai[all]\n"
63
+ )
64
+
65
+ raise ImportError(error_msg)
66
+
67
+
68
+ def install_optional_dependency(package_name: str, integration_name: str, install_extra: str = None) -> bool:
69
+ """
70
+ Attempt to automatically install an optional dependency (USE WITH CAUTION).
71
+
72
+ This function is provided for convenience but automatic installation can be risky.
73
+ It's generally better to install dependencies manually.
74
+
75
+ Args:
76
+ package_name: The actual package name to install
77
+ integration_name: The friendly name for the integration
78
+ install_extra: The extras_require key for pip install euriai[extra]
79
+
80
+ Returns:
81
+ bool: True if installation succeeded, False otherwise
82
+ """
83
+ import subprocess
84
+ import sys
85
+
86
+ try:
87
+ # Try to import first
88
+ __import__(package_name)
89
+ print(f"✓ {integration_name} is already installed")
90
+ return True
91
+ except ImportError:
92
+ pass
93
+
94
+ # Ask user for confirmation
95
+ extra_option = f"euriai[{install_extra}]" if install_extra else f"euriai[{integration_name.lower()}]"
96
+
97
+ print(f"🔍 {integration_name} is not installed.")
98
+ print(f"📦 Recommended installation: pip install {extra_option}")
99
+
100
+ response = input(f"Would you like to automatically install {package_name}? (y/N): ").lower()
101
+
102
+ if response in ['y', 'yes']:
103
+ try:
104
+ print(f"📥 Installing {package_name}...")
105
+ subprocess.check_call([sys.executable, "-m", "pip", "install", package_name])
106
+ print(f"✅ {integration_name} installed successfully!")
107
+ return True
108
+ except subprocess.CalledProcessError as e:
109
+ print(f"❌ Failed to install {package_name}: {e}")
110
+ print(f"💡 Try manually: pip install {extra_option}")
111
+ return False
112
+ else:
113
+ print(f"💡 To install manually run: pip install {extra_option}")
114
+ return False
115
+
116
+
117
+ # Lazy loading functions for optional integrations
118
+ def _get_langchain():
119
+ """Lazy import for LangChain integration."""
120
+ try:
121
+ from . import langchain
122
+ return langchain
123
+ except ImportError:
124
+ check_optional_dependency("langchain-core", "LangChain", "langchain")
125
+
126
+ def _get_crewai():
127
+ """Lazy import for CrewAI integration."""
128
+ try:
129
+ from . import crewai
130
+ return crewai
131
+ except ImportError:
132
+ check_optional_dependency("crewai", "CrewAI", "crewai")
133
+
134
+ def _get_autogen():
135
+ """Lazy import for AutoGen integration."""
136
+ try:
137
+ from . import autogen
138
+ return autogen
139
+ except ImportError:
140
+ check_optional_dependency("pyautogen", "AutoGen", "autogen")
141
+
142
+ def _get_smolagents():
143
+ """Lazy import for SmolAgents integration."""
144
+ try:
145
+ from . import smolagents
146
+ return smolagents
147
+ except ImportError:
148
+ check_optional_dependency("smolagents", "SmolAgents", "smolagents")
149
+
150
+ def _get_langgraph():
151
+ """Lazy import for LangGraph integration."""
152
+ try:
153
+ from . import langgraph
154
+ return langgraph
155
+ except ImportError:
156
+ check_optional_dependency("langgraph", "LangGraph", "langgraph")
157
+
158
+ def _get_llamaindex():
159
+ """Lazy import for LlamaIndex integration."""
160
+ try:
161
+ from . import llamaindex
162
+ return llamaindex
163
+ except ImportError:
164
+ check_optional_dependency("llama-index", "LlamaIndex", "llama-index")
165
+
166
+
167
+ # Create lazy loading properties
168
+ class _LazyLoader:
169
+ """Lazy loader for optional integrations."""
170
+
171
+ @property
172
+ def langchain(self):
173
+ return _get_langchain()
174
+
175
+ @property
176
+ def crewai(self):
177
+ return _get_crewai()
178
+
179
+ @property
180
+ def autogen(self):
181
+ return _get_autogen()
182
+
183
+ @property
184
+ def smolagents(self):
185
+ return _get_smolagents()
186
+
187
+ @property
188
+ def langgraph(self):
189
+ return _get_langgraph()
190
+
191
+ @property
192
+ def llamaindex(self):
193
+ return _get_llamaindex()
194
+
195
+
196
+ # Create the lazy loader instance
197
+ _lazy = _LazyLoader()
198
+
199
+ # Make the integrations available as module-level attributes
200
+ def __getattr__(name: str):
201
+ """Handle lazy loading of optional integrations."""
202
+ if hasattr(_lazy, name):
203
+ return getattr(_lazy, name)
204
204
  raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
@@ -573,6 +573,17 @@ class EuriaiLangGraph:
573
573
  if self.compiled_graph is None:
574
574
  self.compile_graph()
575
575
 
576
+ # Prepare config for checkpointer if needed
577
+ if config is None:
578
+ config = {}
579
+
580
+ # If checkpointer is enabled and no thread_id provided, create one
581
+ if self.checkpointer is not None and "configurable" not in config:
582
+ import uuid
583
+ config["configurable"] = {
584
+ "thread_id": str(uuid.uuid4())
585
+ }
586
+
576
587
  # Execute workflow asynchronously
577
588
  result = await self.compiled_graph.ainvoke(input_state, config=config)
578
589
 
@@ -613,6 +624,17 @@ class EuriaiLangGraph:
613
624
  if self.compiled_graph is None:
614
625
  self.compile_graph()
615
626
 
627
+ # Prepare config for checkpointer if needed
628
+ if config is None:
629
+ config = {}
630
+
631
+ # If checkpointer is enabled and no thread_id provided, create one
632
+ if self.checkpointer is not None and "configurable" not in config:
633
+ import uuid
634
+ config["configurable"] = {
635
+ "thread_id": str(uuid.uuid4())
636
+ }
637
+
616
638
  for chunk in self.compiled_graph.stream(input_state, config=config):
617
639
  yield chunk
618
640
 
@@ -634,9 +656,54 @@ class EuriaiLangGraph:
634
656
  if self.compiled_graph is None:
635
657
  self.compile_graph()
636
658
 
659
+ # Prepare config for checkpointer if needed
660
+ if config is None:
661
+ config = {}
662
+
663
+ # If checkpointer is enabled and no thread_id provided, create one
664
+ if self.checkpointer is not None and "configurable" not in config:
665
+ import uuid
666
+ config["configurable"] = {
667
+ "thread_id": str(uuid.uuid4())
668
+ }
669
+
637
670
  async for chunk in self.compiled_graph.astream(input_state, config=config):
638
671
  yield chunk
639
672
 
673
+ async def abatch(
674
+ self,
675
+ input_states: List[Dict[str, Any]],
676
+ config: Optional[Dict[str, Any]] = None
677
+ ) -> List[Dict[str, Any]]:
678
+ """
679
+ Async batch processing of multiple inputs.
680
+
681
+ Args:
682
+ input_states: List of input states to process
683
+ config: Optional configuration for the run
684
+
685
+ Returns:
686
+ List of final states after workflow execution
687
+ """
688
+ # Prepare config for checkpointer if needed
689
+ if config is None:
690
+ config = {}
691
+
692
+ # If checkpointer is enabled and no thread_id provided, create one
693
+ if self.checkpointer is not None and "configurable" not in config:
694
+ import uuid
695
+ config["configurable"] = {
696
+ "thread_id": str(uuid.uuid4())
697
+ }
698
+
699
+ # Process all inputs concurrently
700
+ results = []
701
+ for input_state in input_states:
702
+ result = await self.arun(input_state, config=config)
703
+ results.append(result)
704
+
705
+ return results
706
+
640
707
  def create_workflow_pattern(self, pattern_type: WorkflowType, **kwargs) -> None:
641
708
  """
642
709
  Create a pre-defined workflow pattern.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: euriai
3
- Version: 1.0.15
3
+ Version: 1.0.16
4
4
  Summary: Python client for Euri API (euron.one) with CLI, LangChain, and LlamaIndex integration
5
5
  Author: Euri
6
6
  Author-email: tech@euron.one
@@ -1,50 +1,50 @@
1
- from setuptools import setup, find_packages
2
-
3
- setup(
4
- name="euriai",
5
- version="1.0.15",
6
- description="Python client for Euri API (euron.one) with CLI, LangChain, and LlamaIndex integration",
7
- long_description=open("README.md", encoding="utf-8").read(),
8
- long_description_content_type="text/markdown",
9
- author="Euri",
10
- author_email="tech@euron.one",
11
- packages=find_packages(include=["euriai", "euriai.*", "euri"]),
12
- install_requires=[
13
- "requests",
14
- "numpy",
15
- "pyyaml",
16
- ],
17
- extras_require={
18
- "langchain-core": ["langchain-core"],
19
- "langchain": ["langchain"],
20
- "llama-index": ["llama-index>=0.10.0"],
21
- "langgraph": ["langgraph"],
22
- "smolagents": ["smolagents"],
23
- "n8n": ["requests"],
24
- "crewai": ["crewai"],
25
- "autogen": ["pyautogen"],
26
- "test": ["pytest"],
27
- "all": [
28
- "langchain-core",
29
- "langchain",
30
- "llama-index>=0.10.0",
31
- "langgraph",
32
- "smolagents",
33
- "crewai",
34
- "pyautogen"
35
- ],
36
- },
37
- python_requires=">=3.6",
38
- entry_points={
39
- "console_scripts": [
40
- "euriai=euriai.cli:main"
41
- ]
42
- },
43
- classifiers=[
44
- "Programming Language :: Python :: 3",
45
- "Operating System :: OS Independent",
46
- "License :: OSI Approved :: MIT License",
47
- "Intended Audience :: Developers",
48
- ],
49
- license="MIT",
50
- )
1
+ from setuptools import setup, find_packages
2
+
3
+ setup(
4
+ name="euriai",
5
+ version="1.0.16",
6
+ description="Python client for Euri API (euron.one) with CLI, LangChain, and LlamaIndex integration",
7
+ long_description=open("README.md", encoding="utf-8").read(),
8
+ long_description_content_type="text/markdown",
9
+ author="Euri",
10
+ author_email="tech@euron.one",
11
+ packages=find_packages(include=["euriai", "euriai.*", "euri"]),
12
+ install_requires=[
13
+ "requests",
14
+ "numpy",
15
+ "pyyaml",
16
+ ],
17
+ extras_require={
18
+ "langchain-core": ["langchain-core"],
19
+ "langchain": ["langchain"],
20
+ "llama-index": ["llama-index>=0.10.0"],
21
+ "langgraph": ["langgraph"],
22
+ "smolagents": ["smolagents"],
23
+ "n8n": ["requests"],
24
+ "crewai": ["crewai"],
25
+ "autogen": ["pyautogen"],
26
+ "test": ["pytest"],
27
+ "all": [
28
+ "langchain-core",
29
+ "langchain",
30
+ "llama-index>=0.10.0",
31
+ "langgraph",
32
+ "smolagents",
33
+ "crewai",
34
+ "pyautogen"
35
+ ],
36
+ },
37
+ python_requires=">=3.6",
38
+ entry_points={
39
+ "console_scripts": [
40
+ "euriai=euriai.cli:main"
41
+ ]
42
+ },
43
+ classifiers=[
44
+ "Programming Language :: Python :: 3",
45
+ "Operating System :: OS Independent",
46
+ "License :: OSI Approved :: MIT License",
47
+ "Intended Audience :: Developers",
48
+ ],
49
+ license="MIT",
50
+ )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes