mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-02 20:58:30 +00:00
Compare commits
9 Commits
lg-update-
...
devin/1748
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e79f591d70 | ||
|
|
4e0501007a | ||
|
|
5ef38b651e | ||
|
|
bb541c059c | ||
|
|
1d86f196d7 | ||
|
|
231dd027ba | ||
|
|
96735c027a | ||
|
|
b7e4d074a5 | ||
|
|
14145268d2 |
3
score.json
Normal file
3
score.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"score": 4
|
||||
}
|
||||
@@ -225,6 +225,7 @@ class Agent(BaseAgent):
|
||||
task: Task,
|
||||
context: Optional[str] = None,
|
||||
tools: Optional[List[BaseTool]] = None,
|
||||
recursion_depth: int = 0,
|
||||
) -> str:
|
||||
"""Execute a task with the agent.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from typing import Any, AsyncIterable, Dict, List, Optional
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from pydantic import Field, PrivateAttr
|
||||
|
||||
@@ -22,7 +22,6 @@ from crewai.utilities.events.agent_events import (
|
||||
)
|
||||
|
||||
try:
|
||||
from langchain_core.messages import ToolMessage
|
||||
from langgraph.checkpoint.memory import MemorySaver
|
||||
from langgraph.prebuilt import create_react_agent
|
||||
|
||||
@@ -126,6 +125,7 @@ class LangGraphAgentAdapter(BaseAgentAdapter):
|
||||
task: Any,
|
||||
context: Optional[str] = None,
|
||||
tools: Optional[List[BaseTool]] = None,
|
||||
recursion_depth: int = 0,
|
||||
) -> str:
|
||||
"""Execute a task using the LangGraph workflow."""
|
||||
self.create_agent_executor(tools)
|
||||
|
||||
@@ -74,7 +74,7 @@ The output should be raw JSON that exactly matches the specified schema.
|
||||
# Validate it's proper JSON
|
||||
json.loads(extracted)
|
||||
return extracted
|
||||
except:
|
||||
except json.JSONDecodeError:
|
||||
pass
|
||||
|
||||
return result
|
||||
|
||||
@@ -86,6 +86,7 @@ class OpenAIAgentAdapter(BaseAgentAdapter):
|
||||
task: Any,
|
||||
context: Optional[str] = None,
|
||||
tools: Optional[List[BaseTool]] = None,
|
||||
recursion_depth: int = 0,
|
||||
) -> str:
|
||||
"""Execute a task using the OpenAI Assistant"""
|
||||
self._converter_adapter.configure_structured_output(task)
|
||||
|
||||
@@ -25,7 +25,7 @@ from crewai.security.security_config import SecurityConfig
|
||||
from crewai.tools.base_tool import BaseTool, Tool
|
||||
from crewai.utilities import I18N, Logger, RPMController
|
||||
from crewai.utilities.config import process_config
|
||||
from crewai.utilities.converter import Converter
|
||||
# Removed unused import: from crewai.utilities.converter import Converter
|
||||
from crewai.utilities.string_utils import interpolate_only
|
||||
|
||||
T = TypeVar("T", bound="BaseAgent")
|
||||
@@ -254,6 +254,7 @@ class BaseAgent(ABC, BaseModel):
|
||||
task: Any,
|
||||
context: Optional[str] = None,
|
||||
tools: Optional[List[BaseTool]] = None,
|
||||
recursion_depth: int = 0,
|
||||
) -> str:
|
||||
pass
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Any, Optional
|
||||
from typing import Any
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import json
|
||||
import re
|
||||
from typing import Any, Callable, Dict, List, Optional, Union
|
||||
|
||||
from crewai.agents.agent_builder.base_agent import BaseAgent
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import subprocess
|
||||
from enum import Enum
|
||||
from typing import List, Optional
|
||||
|
||||
import click
|
||||
from packaging import version
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
# flow_visualizer.py
|
||||
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
from pyvis.network import Network
|
||||
|
||||
from crewai.flow.config import COLORS, NODE_STYLES
|
||||
from crewai.flow.html_template_handler import HTMLTemplateHandler
|
||||
from crewai.flow.legend_generator import generate_legend_items_html, get_legend_items
|
||||
from crewai.flow.path_utils import safe_path_join, validate_path_exists
|
||||
from crewai.flow.path_utils import safe_path_join
|
||||
from crewai.flow.utils import calculate_node_levels
|
||||
from crewai.flow.visualization_utils import (
|
||||
add_edges,
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import base64
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
from crewai.flow.path_utils import safe_path_join, validate_path_exists
|
||||
from crewai.flow.path_utils import validate_path_exists
|
||||
|
||||
|
||||
class HTMLTemplateHandler:
|
||||
|
||||
@@ -5,7 +5,6 @@ This module provides utilities for secure path handling to prevent directory
|
||||
traversal attacks and ensure paths remain within allowed boundaries.
|
||||
"""
|
||||
|
||||
import os
|
||||
from pathlib import Path
|
||||
from typing import List, Union
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ import ast
|
||||
import inspect
|
||||
import textwrap
|
||||
from collections import defaultdict, deque
|
||||
from typing import Any, Deque, Dict, List, Optional, Set, Union
|
||||
from typing import Any, Deque, Dict, List, Optional, Set
|
||||
|
||||
|
||||
def get_possible_return_constants(function: Any) -> Optional[List[str]]:
|
||||
|
||||
@@ -17,7 +17,7 @@ Example
|
||||
|
||||
import ast
|
||||
import inspect
|
||||
from typing import Any, Dict, List, Optional, Tuple, Union
|
||||
from typing import Any, Dict, List, Tuple, Union
|
||||
|
||||
from .utils import (
|
||||
build_ancestor_dict,
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from pathlib import Path
|
||||
from typing import Dict, Iterator, List, Optional, Union
|
||||
from urllib.parse import urlparse
|
||||
from typing import Dict, List, Optional, Union
|
||||
|
||||
from pydantic import Field, field_validator
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import asyncio
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from typing import Any, Callable, Dict, List, Optional, Type, Union, cast
|
||||
|
||||
from pydantic import BaseModel, Field, InstanceOf, PrivateAttr, model_validator
|
||||
@@ -35,7 +34,7 @@ from crewai.utilities.agent_utils import (
|
||||
render_text_description_and_args,
|
||||
show_agent_logs,
|
||||
)
|
||||
from crewai.utilities.converter import convert_to_model, generate_model_description
|
||||
from crewai.utilities.converter import generate_model_description
|
||||
from crewai.utilities.events.agent_events import (
|
||||
LiteAgentExecutionCompletedEvent,
|
||||
LiteAgentExecutionErrorEvent,
|
||||
|
||||
@@ -56,16 +56,11 @@ load_dotenv()
|
||||
|
||||
|
||||
class FilteredStream(io.TextIOBase):
|
||||
_lock = None
|
||||
|
||||
def __init__(self, original_stream: TextIO):
|
||||
self._original_stream = original_stream
|
||||
self._lock = threading.Lock()
|
||||
|
||||
def write(self, s: str) -> int:
|
||||
if not self._lock:
|
||||
self._lock = threading.Lock()
|
||||
|
||||
with self._lock:
|
||||
# Filter out extraneous messages from LiteLLM
|
||||
if (
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Any, Callable, Dict, List, Optional, Union
|
||||
from typing import Any, Dict, List, Optional, Union
|
||||
|
||||
|
||||
class BaseLLM(ABC):
|
||||
|
||||
@@ -10,7 +10,7 @@ The SecurityConfig class is the primary interface for managing security settings
|
||||
in CrewAI applications.
|
||||
"""
|
||||
|
||||
from typing import Any, Dict, Optional
|
||||
from typing import Any, Dict
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
||||
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
from typing import Any, Optional, Tuple
|
||||
from typing import Any, Tuple
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from crewai.agent import Agent, LiteAgentOutput
|
||||
from crewai.llm import LLM
|
||||
from crewai.task import Task
|
||||
from crewai.tasks.task_output import TaskOutput
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from typing import Dict, Optional, Union
|
||||
from typing import Optional
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
from typing import List, Set
|
||||
|
||||
from crewai.agents.agent_builder.base_agent import BaseAgent
|
||||
from crewai.tools.base_tool import BaseTool
|
||||
from crewai.utilities import I18N
|
||||
@@ -22,11 +24,33 @@ class AgentTools:
|
||||
i18n=self.i18n,
|
||||
description=self.i18n.tools("delegate_work").format(coworkers=coworkers), # type: ignore
|
||||
)
|
||||
delegate_tool._agent_tools = self._get_all_agent_tools()
|
||||
|
||||
ask_tool = AskQuestionTool(
|
||||
agents=self.agents,
|
||||
i18n=self.i18n,
|
||||
description=self.i18n.tools("ask_question").format(coworkers=coworkers), # type: ignore
|
||||
)
|
||||
ask_tool._agent_tools = self._get_all_agent_tools()
|
||||
|
||||
return [delegate_tool, ask_tool]
|
||||
|
||||
def _get_all_agent_tools(self) -> list[BaseTool]:
|
||||
"""
|
||||
Get all tools from all agents for recursive invocation.
|
||||
|
||||
Returns:
|
||||
list[BaseTool]: A deduplicated list of all tools from all agents.
|
||||
"""
|
||||
seen_tools: Set[int] = set()
|
||||
unique_tools: List[BaseTool] = []
|
||||
|
||||
for agent in self.agents:
|
||||
if agent.tools:
|
||||
for tool in agent.tools:
|
||||
tool_id = id(tool)
|
||||
if tool_id not in seen_tools:
|
||||
seen_tools.add(tool_id)
|
||||
unique_tools.append(tool)
|
||||
|
||||
return unique_tools
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
from typing import Optional
|
||||
from typing import List, Optional
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from crewai.tools.agent_tools.base_agent_tools import BaseAgentTool
|
||||
from crewai.tools.base_tool import BaseTool
|
||||
|
||||
|
||||
class AskQuestionToolSchema(BaseModel):
|
||||
@@ -16,6 +17,7 @@ class AskQuestionTool(BaseAgentTool):
|
||||
|
||||
name: str = "Ask question to coworker"
|
||||
args_schema: type[BaseModel] = AskQuestionToolSchema
|
||||
_agent_tools: Optional[List[BaseTool]] = None
|
||||
|
||||
def _run(
|
||||
self,
|
||||
@@ -25,4 +27,5 @@ class AskQuestionTool(BaseAgentTool):
|
||||
**kwargs,
|
||||
) -> str:
|
||||
coworker = self._get_coworker(coworker, **kwargs)
|
||||
return self._execute(coworker, question, context)
|
||||
tools = self._get_tools(**kwargs)
|
||||
return self._execute(coworker, question, context, tools)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import logging
|
||||
from typing import Optional
|
||||
from typing import List, Optional
|
||||
|
||||
from pydantic import Field
|
||||
|
||||
@@ -18,6 +18,7 @@ class BaseAgentTool(BaseTool):
|
||||
i18n: I18N = Field(
|
||||
default_factory=I18N, description="Internationalization settings"
|
||||
)
|
||||
MAX_RECURSION_DEPTH: int = 5
|
||||
|
||||
def sanitize_agent_name(self, name: str) -> str:
|
||||
"""
|
||||
@@ -46,11 +47,22 @@ class BaseAgentTool(BaseTool):
|
||||
coworker = coworker[1:-1].split(",")[0]
|
||||
return coworker
|
||||
|
||||
def _get_tools(self, **kwargs) -> Optional[List[BaseTool]]:
|
||||
"""
|
||||
Get tools from instance or kwargs.
|
||||
|
||||
Returns:
|
||||
Optional[List[BaseTool]]: The tools to use for recursive invocation.
|
||||
"""
|
||||
return getattr(self, "_agent_tools", None) or kwargs.get("tools")
|
||||
|
||||
def _execute(
|
||||
self,
|
||||
agent_name: Optional[str],
|
||||
task: str,
|
||||
context: Optional[str] = None
|
||||
context: Optional[str] = None,
|
||||
tools: Optional[List[BaseTool]] = None,
|
||||
recursion_depth: int = 0,
|
||||
) -> str:
|
||||
"""
|
||||
Execute delegation to an agent with case-insensitive and whitespace-tolerant matching.
|
||||
@@ -59,11 +71,25 @@ class BaseAgentTool(BaseTool):
|
||||
agent_name: Name/role of the agent to delegate to (case-insensitive)
|
||||
task: The specific question or task to delegate
|
||||
context: Optional additional context for the task execution
|
||||
tools: Optional tools to pass to the delegated agent for recursive invocation
|
||||
recursion_depth: Current recursion depth to prevent infinite loops
|
||||
|
||||
Returns:
|
||||
str: The execution result from the delegated agent or an error message
|
||||
if the agent cannot be found
|
||||
"""
|
||||
if tools is not None and not all(isinstance(tool, BaseTool) for tool in tools):
|
||||
return self.i18n.errors("agent_tool_execution_error").format(
|
||||
agent_role="unknown",
|
||||
error="Invalid tools provided: all tools must inherit from BaseTool",
|
||||
)
|
||||
|
||||
if recursion_depth >= self.MAX_RECURSION_DEPTH:
|
||||
return self.i18n.errors("agent_tool_execution_error").format(
|
||||
agent_role="unknown",
|
||||
error=f"Maximum recursion depth ({self.MAX_RECURSION_DEPTH}) exceeded",
|
||||
)
|
||||
|
||||
try:
|
||||
if agent_name is None:
|
||||
agent_name = ""
|
||||
@@ -82,12 +108,12 @@ class BaseAgentTool(BaseTool):
|
||||
available_agents = [agent.role for agent in self.agents]
|
||||
logger.debug(f"Available agents: {available_agents}")
|
||||
|
||||
agent = [ # type: ignore # Incompatible types in assignment (expression has type "list[BaseAgent]", variable has type "str | None")
|
||||
matching_agents = [
|
||||
available_agent
|
||||
for available_agent in self.agents
|
||||
if self.sanitize_agent_name(available_agent.role) == sanitized_name
|
||||
]
|
||||
logger.debug(f"Found {len(agent)} matching agents for role '{sanitized_name}'")
|
||||
logger.debug(f"Found {len(matching_agents)} matching agents for role '{sanitized_name}'")
|
||||
except (AttributeError, ValueError) as e:
|
||||
# Handle specific exceptions that might occur during role name processing
|
||||
return self.i18n.errors("agent_tool_unexisting_coworker").format(
|
||||
@@ -97,7 +123,7 @@ class BaseAgentTool(BaseTool):
|
||||
error=str(e)
|
||||
)
|
||||
|
||||
if not agent:
|
||||
if not matching_agents:
|
||||
# No matching agent found after sanitization
|
||||
return self.i18n.errors("agent_tool_unexisting_coworker").format(
|
||||
coworkers="\n".join(
|
||||
@@ -106,16 +132,20 @@ class BaseAgentTool(BaseTool):
|
||||
error=f"No agent found with role '{sanitized_name}'"
|
||||
)
|
||||
|
||||
agent = agent[0]
|
||||
agent = matching_agents[0]
|
||||
try:
|
||||
logger.debug(f"Executing task with {len(tools) if tools else 0} tools at recursion depth {recursion_depth}")
|
||||
task_with_assigned_agent = Task(
|
||||
description=task,
|
||||
agent=agent,
|
||||
expected_output=agent.i18n.slice("manager_request"),
|
||||
i18n=agent.i18n,
|
||||
tools=tools,
|
||||
)
|
||||
logger.debug(f"Created task for agent '{self.sanitize_agent_name(agent.role)}': {task}")
|
||||
return agent.execute_task(task_with_assigned_agent, context)
|
||||
return agent.execute_task(
|
||||
task_with_assigned_agent, context, tools, recursion_depth + 1
|
||||
)
|
||||
except Exception as e:
|
||||
# Handle task creation or execution errors
|
||||
return self.i18n.errors("agent_tool_execution_error").format(
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
from typing import Optional
|
||||
from typing import List, Optional
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from crewai.tools.agent_tools.base_agent_tools import BaseAgentTool
|
||||
from crewai.tools.base_tool import BaseTool
|
||||
|
||||
|
||||
class DelegateWorkToolSchema(BaseModel):
|
||||
@@ -18,6 +19,7 @@ class DelegateWorkTool(BaseAgentTool):
|
||||
|
||||
name: str = "Delegate work to coworker"
|
||||
args_schema: type[BaseModel] = DelegateWorkToolSchema
|
||||
_agent_tools: Optional[List[BaseTool]] = None
|
||||
|
||||
def _run(
|
||||
self,
|
||||
@@ -27,4 +29,5 @@ class DelegateWorkTool(BaseAgentTool):
|
||||
**kwargs,
|
||||
) -> str:
|
||||
coworker = self._get_coworker(coworker, **kwargs)
|
||||
return self._execute(coworker, task, context)
|
||||
tools = self._get_tools(**kwargs)
|
||||
return self._execute(coworker, task, context, tools)
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import asyncio
|
||||
import warnings
|
||||
from abc import ABC, abstractmethod
|
||||
from inspect import signature
|
||||
from typing import Any, Callable, Type, get_args, get_origin
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from logging import Logger
|
||||
|
||||
from crewai.utilities.events.crewai_event_bus import CrewAIEventsBus, crewai_event_bus
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from typing import Any, List
|
||||
from typing import List
|
||||
from unittest.mock import Mock
|
||||
|
||||
import pytest
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -208,4 +208,323 @@ interactions:
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
- request:
|
||||
body: !!binary |
|
||||
CtSAAQokCiIKDHNlcnZpY2UubmFtZRISChBjcmV3QUktdGVsZW1ldHJ5EqqAAQoSChBjcmV3YWku
|
||||
dGVsZW1ldHJ5EpQIChCxfHslIsYSZ0AfQT4MLKBmEgiEdxDe+uM77CoMQ3JldyBDcmVhdGVkMAE5
|
||||
fTZSEqOsQhhB9i9iEqOsQhhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMjEuMEoaCg5weXRob25f
|
||||
dmVyc2lvbhIICgYzLjEyLjdKLgoIY3Jld19rZXkSIgogNjk0NjU0YTMxOGY3MTk4ODNjMDZmOGU2
|
||||
ZDlhNzU0OWZKMQoHY3Jld19pZBImCiRmNjkxYzg3Yy01OTdjLTRjZTAtOWJlMS1jMDllMGIwNjNm
|
||||
MzhKHAoMY3Jld19wcm9jZXNzEgwKCnNlcXVlbnRpYWxKEQoLY3Jld19tZW1vcnkSAhAAShoKFGNy
|
||||
ZXdfbnVtYmVyX29mX3Rhc2tzEgIYAUobChVjcmV3X251bWJlcl9vZl9hZ2VudHMSAhgBSjoKEGNy
|
||||
ZXdfZmluZ2VycHJpbnQSJgokMTBjNmIzYmYtODViYy00YTBiLTg3MjQtNmM3N2E1MzhiOWZlSjsK
|
||||
G2NyZXdfZmluZ2VycHJpbnRfY3JlYXRlZF9hdBIcChoyMDI1LTA1LTI1VDA1OjAzOjQxLjc1OTAw
|
||||
OUrMAgoLY3Jld19hZ2VudHMSvAIKuQJbeyJrZXkiOiAiNTU4NjliY2IxNjMyM2U3MTI5ZDI1MjM2
|
||||
MmM4NTVkYTYiLCAiaWQiOiAiNmU4NmQzNDgtMmQxNS00OTI4LTg2NjQtZTQyZjlmNjA3YWY0Iiwg
|
||||
InJvbGUiOiAiU2F5IEhpIiwgInZlcmJvc2U/IjogZmFsc2UsICJtYXhfaXRlciI6IDI1LCAibWF4
|
||||
X3JwbSI6IG51bGwsICJmdW5jdGlvbl9jYWxsaW5nX2xsbSI6ICIiLCAibGxtIjogInRlc3QtbW9k
|
||||
ZWwiLCAiZGVsZWdhdGlvbl9lbmFibGVkPyI6IGZhbHNlLCAiYWxsb3dfY29kZV9leGVjdXRpb24/
|
||||
IjogZmFsc2UsICJtYXhfcmV0cnlfbGltaXQiOiAyLCAidG9vbHNfbmFtZXMiOiBbXX1dSvsBCgpj
|
||||
cmV3X3Rhc2tzEuwBCukBW3sia2V5IjogImRlMjk0MGYwNmFkOGE0MTZjMjhjYzBmMjYxMGYxODBi
|
||||
IiwgImlkIjogImJjN2RjZTk3LWE3ZmMtNDczYi1iMDcyLTYwZDdmNjQwYTA2YSIsICJhc3luY19l
|
||||
eGVjdXRpb24/IjogZmFsc2UsICJodW1hbl9pbnB1dD8iOiBmYWxzZSwgImFnZW50X3JvbGUiOiAi
|
||||
U2F5IEhpIiwgImFnZW50X2tleSI6ICI1NTg2OWJjYjE2MzIzZTcxMjlkMjUyMzYyYzg1NWRhNiIs
|
||||
ICJ0b29sc19uYW1lcyI6IFtdfV16AhgBhQEAAQAAEoAEChDPEM1Lpx6RLwOuty7gS4p7EggxqsdP
|
||||
6RBS6CoMVGFzayBDcmVhdGVkMAE5KWuiEqOsQhhBP5CjEqOsQhhKLgoIY3Jld19rZXkSIgogNjk0
|
||||
NjU0YTMxOGY3MTk4ODNjMDZmOGU2ZDlhNzU0OWZKMQoHY3Jld19pZBImCiRmNjkxYzg3Yy01OTdj
|
||||
LTRjZTAtOWJlMS1jMDllMGIwNjNmMzhKLgoIdGFza19rZXkSIgogZGUyOTQwZjA2YWQ4YTQxNmMy
|
||||
OGNjMGYyNjEwZjE4MGJKMQoHdGFza19pZBImCiRiYzdkY2U5Ny1hN2ZjLTQ3M2ItYjA3Mi02MGQ3
|
||||
ZjY0MGEwNmFKOgoQY3Jld19maW5nZXJwcmludBImCiQxMGM2YjNiZi04NWJjLTRhMGItODcyNC02
|
||||
Yzc3YTUzOGI5ZmVKOgoQdGFza19maW5nZXJwcmludBImCiQ3ZTRmNDdhMi05OWM4LTRmZDktOGNi
|
||||
My0wZTY4ZTQ4N2NkZjVKOwobdGFza19maW5nZXJwcmludF9jcmVhdGVkX2F0EhwKGjIwMjUtMDUt
|
||||
MjVUMDU6MDM6NDEuNzU4OTIxSjsKEWFnZW50X2ZpbmdlcnByaW50EiYKJDU5MDczMjJmLTJiNDMt
|
||||
NGJkNy04ZGRkLTljZGVlMDE4ZDNjM3oCGAGFAQABAAASaQoQsXx7JSLGEmdAH0E+DCygZhIIhHcQ
|
||||
3vrjO+wqEFRvb2wgVXNhZ2UgRXJyb3IwATlCe2MXo6xCGEE6ZH0Xo6xCGEobCg5jcmV3YWlfdmVy
|
||||
c2lvbhIJCgcwLjEyMS4wegIYAYUBAAEAABJpChDPEM1Lpx6RLwOuty7gS4p7EggxqsdP6RBS6CoQ
|
||||
VG9vbCBVc2FnZSBFcnJvcjABOYlbIhijrEIYQV7XLxijrEIYShsKDmNyZXdhaV92ZXJzaW9uEgkK
|
||||
BzAuMTIxLjB6AhgBhQEAAQAAEmkKEPEw8eZpUC+VK1lsKkf8EIQSCI/bc8hSP5o4KhBUb29sIFVz
|
||||
YWdlIEVycm9yMAE5LHP4GKOsQhhB6AwGGaOsQhhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMjEu
|
||||
MHoCGAGFAQABAAASaQoQNvTwjrmRQ0MlQak2IKYDMhIIeYr2HOHuFfAqEFRvb2wgVXNhZ2UgRXJy
|
||||
b3IwATlyZeYZo6xCGEGvZ/YZo6xCGEobCg5jcmV3YWlfdmVyc2lvbhIJCgcwLjEyMS4wegIYAYUB
|
||||
AAEAABJpChB9IR7iPHEsQZxB5fycGS7cEgjwnEQECYgucSoQVG9vbCBVc2FnZSBFcnJvcjABOcmN
|
||||
9hqjrEIYQTXkAxujrEIYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTIxLjB6AhgBhQEAAQAAEp0I
|
||||
ChCxfHslIsYSZ0AfQT4MLKBmEgiEdxDe+uM77CoMQ3JldyBDcmVhdGVkMAE5s2pfHKOsQhhBY5dt
|
||||
HKOsQhhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMjEuMEoaCg5weXRob25fdmVyc2lvbhIICgYz
|
||||
LjEyLjdKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoH
|
||||
Y3Jld19pZBImCiQzZTgyZTdiNy0wNmE4LTQ5NDUtOWI3ZC01M2UxYzlkMDA1ZDhKHAoMY3Jld19w
|
||||
cm9jZXNzEgwKCnNlcXVlbnRpYWxKEQoLY3Jld19tZW1vcnkSAhAAShoKFGNyZXdfbnVtYmVyX29m
|
||||
X3Rhc2tzEgIYAUobChVjcmV3X251bWJlcl9vZl9hZ2VudHMSAhgBSjoKEGNyZXdfZmluZ2VycHJp
|
||||
bnQSJgokYzZjYTRkMjYtMzk0ZS00ZjI0LWIxOWUtOWUwM2E4Y2ExZTg0SjsKG2NyZXdfZmluZ2Vy
|
||||
cHJpbnRfY3JlYXRlZF9hdBIcChoyMDI1LTA1LTI1VDA1OjAzOjQxLjkyNzgzMkrRAgoLY3Jld19h
|
||||
Z2VudHMSwQIKvgJbeyJrZXkiOiAiYWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIyNDljNGM2NGEiLCAi
|
||||
aWQiOiAiYjkyNGNhYzMtMzE1My00ZWEyLThjMDctYjMyYWRhZGRjM2Q0IiwgInJvbGUiOiAiYmFz
|
||||
ZV9hZ2VudCIsICJ2ZXJib3NlPyI6IGZhbHNlLCAibWF4X2l0ZXIiOiAyNSwgIm1heF9ycG0iOiBu
|
||||
dWxsLCAiZnVuY3Rpb25fY2FsbGluZ19sbG0iOiAiIiwgImxsbSI6ICJncHQtNG8tbWluaSIsICJk
|
||||
ZWxlZ2F0aW9uX2VuYWJsZWQ/IjogZmFsc2UsICJhbGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBmYWxz
|
||||
ZSwgIm1heF9yZXRyeV9saW1pdCI6IDIsICJ0b29sc19uYW1lcyI6IFtdfV1K/wEKCmNyZXdfdGFz
|
||||
a3MS8AEK7QFbeyJrZXkiOiAiMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDIiLCAiaWQi
|
||||
OiAiOTQwZDM5MTktZmU3NC00Mjg0LTkyMDktMzIzZGUxMTJlMjFmIiwgImFzeW5jX2V4ZWN1dGlv
|
||||
bj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6IGZhbHNlLCAiYWdlbnRfcm9sZSI6ICJiYXNlX2Fn
|
||||
ZW50IiwgImFnZW50X2tleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIsICJ0
|
||||
b29sc19uYW1lcyI6IFtdfV16AhgBhQEAAQAAEoAEChDPEM1Lpx6RLwOuty7gS4p7EggxqsdP6RBS
|
||||
6CoMVGFzayBDcmVhdGVkMAE51R2kHKOsQhhB8EylHKOsQhhKLgoIY3Jld19rZXkSIgogZTU4MDcw
|
||||
MWQ1MmViNjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiQzZTgyZTdiNy0wNmE4LTQ5
|
||||
NDUtOWI3ZC01M2UxYzlkMDA1ZDhKLgoIdGFza19rZXkSIgogMWIxNWVmMjM5MTViMjc1NWU4OWEw
|
||||
ZWMzYjI2YTEzZDJKMQoHdGFza19pZBImCiQ5NDBkMzkxOS1mZTc0LTQyODQtOTIwOS0zMjNkZTEx
|
||||
MmUyMWZKOgoQY3Jld19maW5nZXJwcmludBImCiRjNmNhNGQyNi0zOTRlLTRmMjQtYjE5ZS05ZTAz
|
||||
YThjYTFlODRKOgoQdGFza19maW5nZXJwcmludBImCiRhMjA4Y2MyMC00YWNkLTRiNWMtODc1OC0w
|
||||
ZDUwYjU4YzdmYmJKOwobdGFza19maW5nZXJwcmludF9jcmVhdGVkX2F0EhwKGjIwMjUtMDUtMjVU
|
||||
MDU6MDM6MjAuMjIwMzU3SjsKEWFnZW50X2ZpbmdlcnByaW50EiYKJDUzNjZhMGUzLTJmZDAtNDcz
|
||||
NS1iOTMxLTgwYWNlMTcxNzQ2ZHoCGAGFAQABAAASnQgKELF8eyUixhJnQB9BPgwsoGYSCIR3EN76
|
||||
4zvsKgxDcmV3IENyZWF0ZWQwATnYWRUeo6xCGEHJ4SQeo6xCGEobCg5jcmV3YWlfdmVyc2lvbhIJ
|
||||
CgcwLjEyMS4wShoKDnB5dGhvbl92ZXJzaW9uEggKBjMuMTIuN0ouCghjcmV3X2tleRIiCiBlNTgw
|
||||
NzAxZDUyZWI2NWFmZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3X2lkEiYKJGEzMjE2NTE1LWY2ZjYt
|
||||
NDUwOC1hNzhhLTJlMDRkNTQ2NGZhY0ocCgxjcmV3X3Byb2Nlc3MSDAoKc2VxdWVudGlhbEoRCgtj
|
||||
cmV3X21lbW9yeRICEABKGgoUY3Jld19udW1iZXJfb2ZfdGFza3MSAhgBShsKFWNyZXdfbnVtYmVy
|
||||
X29mX2FnZW50cxICGAFKOgoQY3Jld19maW5nZXJwcmludBImCiQzMGM0MWE5YS0wOGZkLTRjZTAt
|
||||
OTMzZS1hMzBiMTcwM2I3NTBKOwobY3Jld19maW5nZXJwcmludF9jcmVhdGVkX2F0EhwKGjIwMjUt
|
||||
MDUtMjVUMDU6MDM6NDEuOTU2MjM1StECCgtjcmV3X2FnZW50cxLBAgq+Alt7ImtleSI6ICJhZDE1
|
||||
MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIsICJpZCI6ICJiOTI0Y2FjMy0zMTUzLTRlYTIt
|
||||
OGMwNy1iMzJhZGFkZGMzZDQiLCAicm9sZSI6ICJiYXNlX2FnZW50IiwgInZlcmJvc2U/IjogZmFs
|
||||
c2UsICJtYXhfaXRlciI6IDI1LCAibWF4X3JwbSI6IG51bGwsICJmdW5jdGlvbl9jYWxsaW5nX2xs
|
||||
bSI6ICIiLCAibGxtIjogImdwdC00by1taW5pIiwgImRlbGVnYXRpb25fZW5hYmxlZD8iOiBmYWxz
|
||||
ZSwgImFsbG93X2NvZGVfZXhlY3V0aW9uPyI6IGZhbHNlLCAibWF4X3JldHJ5X2xpbWl0IjogMiwg
|
||||
InRvb2xzX25hbWVzIjogW119XUr/AQoKY3Jld190YXNrcxLwAQrtAVt7ImtleSI6ICIxYjE1ZWYy
|
||||
MzkxNWIyNzU1ZTg5YTBlYzNiMjZhMTNkMiIsICJpZCI6ICI5NDBkMzkxOS1mZTc0LTQyODQtOTIw
|
||||
OS0zMjNkZTExMmUyMWYiLCAiYXN5bmNfZXhlY3V0aW9uPyI6IGZhbHNlLCAiaHVtYW5faW5wdXQ/
|
||||
IjogZmFsc2UsICJhZ2VudF9yb2xlIjogImJhc2VfYWdlbnQiLCAiYWdlbnRfa2V5IjogImFkMTUz
|
||||
MTYxYzVjNWE4NTZhYTBkMDZiMjQ5YzRjNjRhIiwgInRvb2xzX25hbWVzIjogW119XXoCGAGFAQAB
|
||||
AAASfgoQsXx7JSLGEmdAH0E+DCygZhIIhHcQ3vrjO+wqDkZsb3cgRXhlY3V0aW9uMAE5jI97IKOs
|
||||
QhhBavV7IKOsQhhKFwoJZmxvd19uYW1lEgoKCFRlc3RGbG93ShkKCm5vZGVfbmFtZXMSCwoJWyJi
|
||||
ZWdpbiJdegIYAYUBAAEAABJiChCxfHslIsYSZ0AfQT4MLKBmEgiEdxDe+uM77CoNRmxvdyBDcmVh
|
||||
dGlvbjABOWW3XiGjrEIYQUbqXiGjrEIYShcKCWZsb3dfbmFtZRIKCghUZXN0Rmxvd3oCGAGFAQAB
|
||||
AAASrQgKELF8eyUixhJnQB9BPgwsoGYSCIR3EN764zvsKgxDcmV3IENyZWF0ZWQwATm8fhgio6xC
|
||||
GEFN/Ccio6xCGEobCg5jcmV3YWlfdmVyc2lvbhIJCgcwLjEyMS4wShoKDnB5dGhvbl92ZXJzaW9u
|
||||
EggKBjMuMTIuN0ouCghjcmV3X2tleRIiCiBlNTgwNzAxZDUyZWI2NWFmZjI0ZWVmZTc4Yzc0NjI4
|
||||
Y0oxCgdjcmV3X2lkEiYKJDM4Yjg5OWQ0LTAxOWItNGYwMy05MjU5LTQ3MjQxZDIyZjE5OUocCgxj
|
||||
cmV3X3Byb2Nlc3MSDAoKc2VxdWVudGlhbEoRCgtjcmV3X21lbW9yeRICEABKGgoUY3Jld19udW1i
|
||||
ZXJfb2ZfdGFza3MSAhgBShsKFWNyZXdfbnVtYmVyX29mX2FnZW50cxICGAFKOgoQY3Jld19maW5n
|
||||
ZXJwcmludBImCiRiYjA0YjRiYS01MGFkLTRjMTMtODE1YS1jOTQ5NTc4ODk4MTJKOwobY3Jld19m
|
||||
aW5nZXJwcmludF9jcmVhdGVkX2F0EhwKGjIwMjUtMDUtMjVUMDU6MDM6NDIuMDIzODUwStkCCgtj
|
||||
cmV3X2FnZW50cxLJAgrGAlt7ImtleSI6ICJhZDE1MzE2MWM1YzVhODU2YWEwZDA2YjI0OWM0YzY0
|
||||
YSIsICJpZCI6ICIwNmZhYmU0MC0zZTVmLTRiMDUtYmFlNC1hMjIxZDg5YmViOWQiLCAicm9sZSI6
|
||||
ICJiYXNlX2FnZW50IiwgInZlcmJvc2U/IjogZmFsc2UsICJtYXhfaXRlciI6IDI1LCAibWF4X3Jw
|
||||
bSI6IG51bGwsICJmdW5jdGlvbl9jYWxsaW5nX2xsbSI6ICIiLCAibGxtIjogImdwdC00by1taW5p
|
||||
IiwgImRlbGVnYXRpb25fZW5hYmxlZD8iOiBmYWxzZSwgImFsbG93X2NvZGVfZXhlY3V0aW9uPyI6
|
||||
IGZhbHNlLCAibWF4X3JldHJ5X2xpbWl0IjogMiwgInRvb2xzX25hbWVzIjogWyJzYXlfaGkiXX1d
|
||||
SocCCgpjcmV3X3Rhc2tzEvgBCvUBW3sia2V5IjogIjFiMTVlZjIzOTE1YjI3NTVlODlhMGVjM2Iy
|
||||
NmExM2QyIiwgImlkIjogIjJlNjA0YWUzLTdiY2EtNGFlOC04ODgyLWIxYzQ4NzAyYTY5MSIsICJh
|
||||
c3luY19leGVjdXRpb24/IjogZmFsc2UsICJodW1hbl9pbnB1dD8iOiBmYWxzZSwgImFnZW50X3Jv
|
||||
bGUiOiAiYmFzZV9hZ2VudCIsICJhZ2VudF9rZXkiOiAiYWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIy
|
||||
NDljNGM2NGEiLCAidG9vbHNfbmFtZXMiOiBbInNheV9oaSJdfV16AhgBhQEAAQAAEoAEChDPEM1L
|
||||
px6RLwOuty7gS4p7EggxqsdP6RBS6CoMVGFzayBDcmVhdGVkMAE5VzdrIqOsQhhBLWRsIqOsQhhK
|
||||
LgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19p
|
||||
ZBImCiQzOGI4OTlkNC0wMTliLTRmMDMtOTI1OS00NzI0MWQyMmYxOTlKLgoIdGFza19rZXkSIgog
|
||||
MWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDJKMQoHdGFza19pZBImCiQyZTYwNGFlMy03
|
||||
YmNhLTRhZTgtODg4Mi1iMWM0ODcwMmE2OTFKOgoQY3Jld19maW5nZXJwcmludBImCiRiYjA0YjRi
|
||||
YS01MGFkLTRjMTMtODE1YS1jOTQ5NTc4ODk4MTJKOgoQdGFza19maW5nZXJwcmludBImCiQ2YmNm
|
||||
OTMxZC04YzlhLTRiZWUtYjY5MS05MTNhYzQ0ZTBkZjFKOwobdGFza19maW5nZXJwcmludF9jcmVh
|
||||
dGVkX2F0EhwKGjIwMjUtMDUtMjVUMDU6MDM6NDIuMDIzNzc3SjsKEWFnZW50X2ZpbmdlcnByaW50
|
||||
EiYKJDVjY2RlMTA0LWJhNGUtNGEyNC1iYTVhLTA3YTRjMDg2ZTcxNnoCGAGFAQABAAASigEKEDb0
|
||||
8I65kUNDJUGpNiCmAzISCHmK9hzh7hXwKgpUb29sIFVzYWdlMAE50E7gJKOsQhhBWCPtJKOsQhhK
|
||||
GwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMjEuMEoVCgl0b29sX25hbWUSCAoGc2F5X2hpSg4KCGF0
|
||||
dGVtcHRzEgIYAXoCGAGFAQABAAASnQgKELF8eyUixhJnQB9BPgwsoGYSCIR3EN764zvsKgxDcmV3
|
||||
IENyZWF0ZWQwATlVF78mo6xCGEEA0c8mo6xCGEobCg5jcmV3YWlfdmVyc2lvbhIJCgcwLjEyMS4w
|
||||
ShoKDnB5dGhvbl92ZXJzaW9uEggKBjMuMTIuN0ouCghjcmV3X2tleRIiCiBlNTgwNzAxZDUyZWI2
|
||||
NWFmZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3X2lkEiYKJGM1MjAzMDkwLWM0OWUtNDI3ZC04M2Q0
|
||||
LTFkMWMwNDc5YWZmYkocCgxjcmV3X3Byb2Nlc3MSDAoKc2VxdWVudGlhbEoRCgtjcmV3X21lbW9y
|
||||
eRICEABKGgoUY3Jld19udW1iZXJfb2ZfdGFza3MSAhgBShsKFWNyZXdfbnVtYmVyX29mX2FnZW50
|
||||
cxICGAFKOgoQY3Jld19maW5nZXJwcmludBImCiQzMmJiOWM1MS1mN2JmLTRiMmUtOWQ5MS1iZjYz
|
||||
MjNkNTJhNDRKOwobY3Jld19maW5nZXJwcmludF9jcmVhdGVkX2F0EhwKGjIwMjUtMDUtMjVUMDU6
|
||||
MDM6NDIuMTAyMDQwStECCgtjcmV3X2FnZW50cxLBAgq+Alt7ImtleSI6ICJhZDE1MzE2MWM1YzVh
|
||||
ODU2YWEwZDA2YjI0OWM0YzY0YSIsICJpZCI6ICJhYTYzNDM3NC02YzAzLTQ3ZTgtOTVjMy0yY2M4
|
||||
MWY4M2JiMDUiLCAicm9sZSI6ICJiYXNlX2FnZW50IiwgInZlcmJvc2U/IjogZmFsc2UsICJtYXhf
|
||||
aXRlciI6IDI1LCAibWF4X3JwbSI6IG51bGwsICJmdW5jdGlvbl9jYWxsaW5nX2xsbSI6ICIiLCAi
|
||||
bGxtIjogImdwdC00by1taW5pIiwgImRlbGVnYXRpb25fZW5hYmxlZD8iOiBmYWxzZSwgImFsbG93
|
||||
X2NvZGVfZXhlY3V0aW9uPyI6IGZhbHNlLCAibWF4X3JldHJ5X2xpbWl0IjogMiwgInRvb2xzX25h
|
||||
bWVzIjogW119XUr/AQoKY3Jld190YXNrcxLwAQrtAVt7ImtleSI6ICIxYjE1ZWYyMzkxNWIyNzU1
|
||||
ZTg5YTBlYzNiMjZhMTNkMiIsICJpZCI6ICJlNDAwMDRhNi0wMzY0LTQxNmMtYmUxOS0wY2Q3ZDRl
|
||||
Yzc4MTAiLCAiYXN5bmNfZXhlY3V0aW9uPyI6IGZhbHNlLCAiaHVtYW5faW5wdXQ/IjogZmFsc2Us
|
||||
ICJhZ2VudF9yb2xlIjogImJhc2VfYWdlbnQiLCAiYWdlbnRfa2V5IjogImFkMTUzMTYxYzVjNWE4
|
||||
NTZhYTBkMDZiMjQ5YzRjNjRhIiwgInRvb2xzX25hbWVzIjogW119XXoCGAGFAQABAAASgAQKEM8Q
|
||||
zUunHpEvA663LuBLinsSCDGqx0/pEFLoKgxUYXNrIENyZWF0ZWQwATmvNP4mo6xCGEEVXP8mo6xC
|
||||
GEouCghjcmV3X2tleRIiCiBlNTgwNzAxZDUyZWI2NWFmZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3
|
||||
X2lkEiYKJGM1MjAzMDkwLWM0OWUtNDI3ZC04M2Q0LTFkMWMwNDc5YWZmYkouCgh0YXNrX2tleRIi
|
||||
CiAxYjE1ZWYyMzkxNWIyNzU1ZTg5YTBlYzNiMjZhMTNkMkoxCgd0YXNrX2lkEiYKJGU0MDAwNGE2
|
||||
LTAzNjQtNDE2Yy1iZTE5LTBjZDdkNGVjNzgxMEo6ChBjcmV3X2ZpbmdlcnByaW50EiYKJDMyYmI5
|
||||
YzUxLWY3YmYtNGIyZS05ZDkxLWJmNjMyM2Q1MmE0NEo6ChB0YXNrX2ZpbmdlcnByaW50EiYKJDFi
|
||||
NTVlMTc5LTBiN2EtNGNkZS04ODQ2LTg5NmE2ZTU0Y2EwZUo7Cht0YXNrX2ZpbmdlcnByaW50X2Ny
|
||||
ZWF0ZWRfYXQSHAoaMjAyNS0wNS0yNVQwNTowMzo0Mi4xMDE5MzNKOwoRYWdlbnRfZmluZ2VycHJp
|
||||
bnQSJgokMDJhMDJmNjMtZjBhMy00YjkyLWJhOTMtOTEyN2NjYjhkMDYwegIYAYUBAAEAABK1CAoQ
|
||||
sXx7JSLGEmdAH0E+DCygZhIIhHcQ3vrjO+wqDENyZXcgQ3JlYXRlZDABOboASyyjrEIYQT1xWSyj
|
||||
rEIYShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTIxLjBKGgoOcHl0aG9uX3ZlcnNpb24SCAoGMy4x
|
||||
Mi43Si4KCGNyZXdfa2V5EiIKIDNjZDc4MDc0MDI1NDYwM2JmZGJlYmEyNzBkNTAyNDJkSjEKB2Ny
|
||||
ZXdfaWQSJgokNjI4MzEzZWItMzVhMy00MTU3LWI4MWEtYjk4NTU2NzVhYWRlShwKDGNyZXdfcHJv
|
||||
Y2VzcxIMCgpzZXF1ZW50aWFsShEKC2NyZXdfbWVtb3J5EgIQAEoaChRjcmV3X251bWJlcl9vZl90
|
||||
YXNrcxICGAFKGwoVY3Jld19udW1iZXJfb2ZfYWdlbnRzEgIYAUo6ChBjcmV3X2ZpbmdlcnByaW50
|
||||
EiYKJGJmMjc1NDE4LTE3YTYtNGFkOC1hNWExLTUzNmIwNGRiMDgzOUo7ChtjcmV3X2ZpbmdlcnBy
|
||||
aW50X2NyZWF0ZWRfYXQSHAoaMjAyNS0wNS0yNVQwNTowMzo0Mi4xOTQ3MzJK3QIKC2NyZXdfYWdl
|
||||
bnRzEs0CCsoCW3sia2V5IjogIjA2MDZlYWQ5MDZkNmE5ZmY1MGNmZmJhYjYxZWM2ODBmIiwgImlk
|
||||
IjogImQxNGEzNmQ4LTBiYTYtNDQ0OS1hN2RlLWQ0M2I0NjMyNmZjZCIsICJyb2xlIjogImJhc2Vf
|
||||
YWdlbnQiLCAidmVyYm9zZT8iOiBmYWxzZSwgIm1heF9pdGVyIjogMjUsICJtYXhfcnBtIjogbnVs
|
||||
bCwgImZ1bmN0aW9uX2NhbGxpbmdfbGxtIjogIiIsICJsbG0iOiAiZ3B0LTRvLW1pbmkiLCAiZGVs
|
||||
ZWdhdGlvbl9lbmFibGVkPyI6IGZhbHNlLCAiYWxsb3dfY29kZV9leGVjdXRpb24/IjogZmFsc2Us
|
||||
ICJtYXhfcmV0cnlfbGltaXQiOiAyLCAidG9vbHNfbmFtZXMiOiBbImVycm9yX3Rvb2wiXX1dSosC
|
||||
CgpjcmV3X3Rhc2tzEvwBCvkBW3sia2V5IjogIjIxMTdiOGU0MGFhYTZkNGJiYzM0M2MwZmEzZjBm
|
||||
NGVmIiwgImlkIjogIjQ2YjI1MjU2LTJiMTYtNDcxYi04NmIxLTY2N2IyMGNlOWM3ZCIsICJhc3lu
|
||||
Y19leGVjdXRpb24/IjogZmFsc2UsICJodW1hbl9pbnB1dD8iOiBmYWxzZSwgImFnZW50X3JvbGUi
|
||||
OiAiYmFzZV9hZ2VudCIsICJhZ2VudF9rZXkiOiAiMDYwNmVhZDkwNmQ2YTlmZjUwY2ZmYmFiNjFl
|
||||
YzY4MGYiLCAidG9vbHNfbmFtZXMiOiBbImVycm9yX3Rvb2wiXX1degIYAYUBAAEAABKABAoQzxDN
|
||||
S6cekS8Drrcu4EuKexIIMarHT+kQUugqDFRhc2sgQ3JlYXRlZDABOcG1gCyjrEIYQSzcgSyjrEIY
|
||||
Si4KCGNyZXdfa2V5EiIKIDNjZDc4MDc0MDI1NDYwM2JmZGJlYmEyNzBkNTAyNDJkSjEKB2NyZXdf
|
||||
aWQSJgokNjI4MzEzZWItMzVhMy00MTU3LWI4MWEtYjk4NTU2NzVhYWRlSi4KCHRhc2tfa2V5EiIK
|
||||
IDIxMTdiOGU0MGFhYTZkNGJiYzM0M2MwZmEzZjBmNGVmSjEKB3Rhc2tfaWQSJgokNDZiMjUyNTYt
|
||||
MmIxNi00NzFiLTg2YjEtNjY3YjIwY2U5YzdkSjoKEGNyZXdfZmluZ2VycHJpbnQSJgokYmYyNzU0
|
||||
MTgtMTdhNi00YWQ4LWE1YTEtNTM2YjA0ZGIwODM5SjoKEHRhc2tfZmluZ2VycHJpbnQSJgokMWNh
|
||||
OTA2ZmUtNGZhMS00NGFkLWJjZDMtOGM5MTg2MTlkZmI3SjsKG3Rhc2tfZmluZ2VycHJpbnRfY3Jl
|
||||
YXRlZF9hdBIcChoyMDI1LTA1LTI1VDA1OjAzOjQyLjE5NDY2N0o7ChFhZ2VudF9maW5nZXJwcmlu
|
||||
dBImCiQ1NjkwNzBmZC1kZTBmLTRjZjAtOGJhYy05NWUzYzljMGNkZGN6AhgBhQEAAQAAEmkKEDb0
|
||||
8I65kUNDJUGpNiCmAzISCHmK9hzh7hXwKhBUb29sIFVzYWdlIEVycm9yMAE5DZ6EMKOsQhhBSdGU
|
||||
MKOsQhhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4xMjEuMHoCGAGFAQABAAASaQoQfSEe4jxxLEGc
|
||||
QeX8nBku3BII8JxEBAmILnEqEFRvb2wgVXNhZ2UgRXJyb3IwATlB/M4zo6xCGEGPwdszo6xCGEob
|
||||
Cg5jcmV3YWlfdmVyc2lvbhIJCgcwLjEyMS4wegIYAYUBAAEAABJpChAp7DKO/6lty6GQfkpOVNyI
|
||||
Egh2804SUiW8jioQVG9vbCBVc2FnZSBFcnJvcjABOQcWBzejrEIYQYsPFDejrEIYShsKDmNyZXdh
|
||||
aV92ZXJzaW9uEgkKBzAuMTIxLjB6AhgBhQEAAQAAEmkKEPd/Z4bQYrA6WHznuhKX27oSCKWE9/g7
|
||||
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
|
||||
xhJnQB9BPgwsoGYSCIR3EN764zvsKgxUYXNrIENyZWF0ZWQwATmfFNeio6xCGEGrc9iio6xCGEou
|
||||
CghjcmV3X2tleRIiCiBlNTgwNzAxZDUyZWI2NWFmZjI0ZWVmZTc4Yzc0NjI4Y0oxCgdjcmV3X2lk
|
||||
EiYKJGQ1M2YyMjRiLTE0YmMtNGQzZS1hYTAxLTkyOWZlN2VhZGI1ZEouCgh0YXNrX2tleRIiCiAx
|
||||
YjE1ZWYyMzkxNWIyNzU1ZTg5YTBlYzNiMjZhMTNkMkoxCgd0YXNrX2lkEiYKJDk0MGQzOTE5LWZl
|
||||
NzQtNDI4NC05MjA5LTMyM2RlMTEyZTIxZko6ChBjcmV3X2ZpbmdlcnByaW50EiYKJGQxMWM4Y2M5
|
||||
LTRkMDYtNGE5NC1hY2Y0LWJhMTQ4NWNmODcwZEo6ChB0YXNrX2ZpbmdlcnByaW50EiYKJGEyMDhj
|
||||
YzIwLTRhY2QtNGI1Yy04NzU4LTBkNTBiNThjN2ZiYko7Cht0YXNrX2ZpbmdlcnByaW50X2NyZWF0
|
||||
ZWRfYXQSHAoaMjAyNS0wNS0yNVQwNTowMzoyMC4yMjAzNTdKOwoRYWdlbnRfZmluZ2VycHJpbnQS
|
||||
JgokNTM2NmEwZTMtMmZkMC00NzM1LWI5MzEtODBhY2UxNzE3NDZkegIYAYUBAAEAABKdCAoQsXx7
|
||||
JSLGEmdAH0E+DCygZhIIhHcQ3vrjO+wqDENyZXcgQ3JlYXRlZDABOS7tBqSjrEIYQbY0GKSjrEIY
|
||||
ShsKDmNyZXdhaV92ZXJzaW9uEgkKBzAuMTIxLjBKGgoOcHl0aG9uX3ZlcnNpb24SCAoGMy4xMi43
|
||||
Si4KCGNyZXdfa2V5EiIKIGU1ODA3MDFkNTJlYjY1YWZmMjRlZWZlNzhjNzQ2MjhjSjEKB2NyZXdf
|
||||
aWQSJgokMTYzMTdjYjgtNjhlNy00YmE1LTkzZDYtZjllZDFiMzdlZmE0ShwKDGNyZXdfcHJvY2Vz
|
||||
cxIMCgpzZXF1ZW50aWFsShEKC2NyZXdfbWVtb3J5EgIQAEoaChRjcmV3X251bWJlcl9vZl90YXNr
|
||||
cxICGAFKGwoVY3Jld19udW1iZXJfb2ZfYWdlbnRzEgIYAUo6ChBjcmV3X2ZpbmdlcnByaW50EiYK
|
||||
JDg4NDhhNjRkLTVmZWQtNDgzNy04ZDg3LTQ4YjQxYTJjMjNjMEo7ChtjcmV3X2ZpbmdlcnByaW50
|
||||
X2NyZWF0ZWRfYXQSHAoaMjAyNS0wNS0yNVQwNTowMzo0NC4yMDM3NzhK0QIKC2NyZXdfYWdlbnRz
|
||||
EsECCr4CW3sia2V5IjogImFkMTUzMTYxYzVjNWE4NTZhYTBkMDZiMjQ5YzRjNjRhIiwgImlkIjog
|
||||
ImI5MjRjYWMzLTMxNTMtNGVhMi04YzA3LWIzMmFkYWRkYzNkNCIsICJyb2xlIjogImJhc2VfYWdl
|
||||
bnQiLCAidmVyYm9zZT8iOiBmYWxzZSwgIm1heF9pdGVyIjogMjUsICJtYXhfcnBtIjogbnVsbCwg
|
||||
ImZ1bmN0aW9uX2NhbGxpbmdfbGxtIjogIiIsICJsbG0iOiAiZ3B0LTRvLW1pbmkiLCAiZGVsZWdh
|
||||
dGlvbl9lbmFibGVkPyI6IGZhbHNlLCAiYWxsb3dfY29kZV9leGVjdXRpb24/IjogZmFsc2UsICJt
|
||||
YXhfcmV0cnlfbGltaXQiOiAwLCAidG9vbHNfbmFtZXMiOiBbXX1dSv8BCgpjcmV3X3Rhc2tzEvAB
|
||||
Cu0BW3sia2V5IjogIjFiMTVlZjIzOTE1YjI3NTVlODlhMGVjM2IyNmExM2QyIiwgImlkIjogIjk0
|
||||
MGQzOTE5LWZlNzQtNDI4NC05MjA5LTMyM2RlMTEyZTIxZiIsICJhc3luY19leGVjdXRpb24/Ijog
|
||||
ZmFsc2UsICJodW1hbl9pbnB1dD8iOiBmYWxzZSwgImFnZW50X3JvbGUiOiAiYmFzZV9hZ2VudCIs
|
||||
ICJhZ2VudF9rZXkiOiAiYWQxNTMxNjFjNWM1YTg1NmFhMGQwNmIyNDljNGM2NGEiLCAidG9vbHNf
|
||||
bmFtZXMiOiBbXX1degIYAYUBAAEAABKABAoQzxDNS6cekS8Drrcu4EuKexIIMarHT+kQUugqDFRh
|
||||
c2sgQ3JlYXRlZDABOYraUaSjrEIYQfvrUqSjrEIYSi4KCGNyZXdfa2V5EiIKIGU1ODA3MDFkNTJl
|
||||
YjY1YWZmMjRlZWZlNzhjNzQ2MjhjSjEKB2NyZXdfaWQSJgokMTYzMTdjYjgtNjhlNy00YmE1LTkz
|
||||
ZDYtZjllZDFiMzdlZmE0Si4KCHRhc2tfa2V5EiIKIDFiMTVlZjIzOTE1YjI3NTVlODlhMGVjM2Iy
|
||||
NmExM2QySjEKB3Rhc2tfaWQSJgokOTQwZDM5MTktZmU3NC00Mjg0LTkyMDktMzIzZGUxMTJlMjFm
|
||||
SjoKEGNyZXdfZmluZ2VycHJpbnQSJgokODg0OGE2NGQtNWZlZC00ODM3LThkODctNDhiNDFhMmMy
|
||||
M2MwSjoKEHRhc2tfZmluZ2VycHJpbnQSJgokYTIwOGNjMjAtNGFjZC00YjVjLTg3NTgtMGQ1MGI1
|
||||
OGM3ZmJiSjsKG3Rhc2tfZmluZ2VycHJpbnRfY3JlYXRlZF9hdBIcChoyMDI1LTA1LTI1VDA1OjAz
|
||||
OjIwLjIyMDM1N0o7ChFhZ2VudF9maW5nZXJwcmludBImCiQ1MzY2YTBlMy0yZmQwLTQ3MzUtYjkz
|
||||
MS04MGFjZTE3MTc0NmR6AhgBhQEAAQAAEp0IChCxfHslIsYSZ0AfQT4MLKBmEgiEdxDe+uM77CoM
|
||||
Q3JldyBDcmVhdGVkMAE5gTZ1paOsQhhBjR+EpaOsQhhKGwoOY3Jld2FpX3ZlcnNpb24SCQoHMC4x
|
||||
MjEuMEoaCg5weXRob25fdmVyc2lvbhIICgYzLjEyLjdKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1
|
||||
MmViNjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoHY3Jld19pZBImCiQxZDcxYTZjNy00MTFmLTQ4M2Qt
|
||||
ODc2Ny04MDczM2MwNDMyZWZKHAoMY3Jld19wcm9jZXNzEgwKCnNlcXVlbnRpYWxKEQoLY3Jld19t
|
||||
ZW1vcnkSAhAAShoKFGNyZXdfbnVtYmVyX29mX3Rhc2tzEgIYAUobChVjcmV3X251bWJlcl9vZl9h
|
||||
Z2VudHMSAhgBSjoKEGNyZXdfZmluZ2VycHJpbnQSJgokMDRhMzRkZDUtNzQ0NC00ZDFiLWIyMmYt
|
||||
ZWNhMTQ5YTI2NDA0SjsKG2NyZXdfZmluZ2VycHJpbnRfY3JlYXRlZF9hdBIcChoyMDI1LTA1LTI1
|
||||
VDA1OjAzOjQ0LjIyNzY5OUrRAgoLY3Jld19hZ2VudHMSwQIKvgJbeyJrZXkiOiAiYWQxNTMxNjFj
|
||||
NWM1YTg1NmFhMGQwNmIyNDljNGM2NGEiLCAiaWQiOiAiYjkyNGNhYzMtMzE1My00ZWEyLThjMDct
|
||||
YjMyYWRhZGRjM2Q0IiwgInJvbGUiOiAiYmFzZV9hZ2VudCIsICJ2ZXJib3NlPyI6IGZhbHNlLCAi
|
||||
bWF4X2l0ZXIiOiAyNSwgIm1heF9ycG0iOiBudWxsLCAiZnVuY3Rpb25fY2FsbGluZ19sbG0iOiAi
|
||||
IiwgImxsbSI6ICJncHQtNG8tbWluaSIsICJkZWxlZ2F0aW9uX2VuYWJsZWQ/IjogZmFsc2UsICJh
|
||||
bGxvd19jb2RlX2V4ZWN1dGlvbj8iOiBmYWxzZSwgIm1heF9yZXRyeV9saW1pdCI6IDAsICJ0b29s
|
||||
c19uYW1lcyI6IFtdfV1K/wEKCmNyZXdfdGFza3MS8AEK7QFbeyJrZXkiOiAiMWIxNWVmMjM5MTVi
|
||||
Mjc1NWU4OWEwZWMzYjI2YTEzZDIiLCAiaWQiOiAiOTQwZDM5MTktZmU3NC00Mjg0LTkyMDktMzIz
|
||||
ZGUxMTJlMjFmIiwgImFzeW5jX2V4ZWN1dGlvbj8iOiBmYWxzZSwgImh1bWFuX2lucHV0PyI6IGZh
|
||||
bHNlLCAiYWdlbnRfcm9sZSI6ICJiYXNlX2FnZW50IiwgImFnZW50X2tleSI6ICJhZDE1MzE2MWM1
|
||||
YzVhODU2YWEwZDA2YjI0OWM0YzY0YSIsICJ0b29sc19uYW1lcyI6IFtdfV16AhgBhQEAAQAAEoAE
|
||||
ChDPEM1Lpx6RLwOuty7gS4p7EggxqsdP6RBS6CoMVGFzayBDcmVhdGVkMAE56QezpaOsQhhB7y20
|
||||
paOsQhhKLgoIY3Jld19rZXkSIgogZTU4MDcwMWQ1MmViNjVhZmYyNGVlZmU3OGM3NDYyOGNKMQoH
|
||||
Y3Jld19pZBImCiQxZDcxYTZjNy00MTFmLTQ4M2QtODc2Ny04MDczM2MwNDMyZWZKLgoIdGFza19r
|
||||
ZXkSIgogMWIxNWVmMjM5MTViMjc1NWU4OWEwZWMzYjI2YTEzZDJKMQoHdGFza19pZBImCiQ5NDBk
|
||||
MzkxOS1mZTc0LTQyODQtOTIwOS0zMjNkZTExMmUyMWZKOgoQY3Jld19maW5nZXJwcmludBImCiQw
|
||||
NGEzNGRkNS03NDQ0LTRkMWItYjIyZi1lY2ExNDlhMjY0MDRKOgoQdGFza19maW5nZXJwcmludBIm
|
||||
CiRhMjA4Y2MyMC00YWNkLTRiNWMtODc1OC0wZDUwYjU4YzdmYmJKOwobdGFza19maW5nZXJwcmlu
|
||||
dF9jcmVhdGVkX2F0EhwKGjIwMjUtMDUtMjVUMDU6MDM6MjAuMjIwMzU3SjsKEWFnZW50X2Zpbmdl
|
||||
cnByaW50EiYKJDUzNjZhMGUzLTJmZDAtNDczNS1iOTMxLTgwYWNlMTcxNzQ2ZHoCGAGFAQABAAA=
|
||||
headers:
|
||||
Accept:
|
||||
- '*/*'
|
||||
Accept-Encoding:
|
||||
- gzip, deflate
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Length:
|
||||
- '16472'
|
||||
Content-Type:
|
||||
- application/x-protobuf
|
||||
User-Agent:
|
||||
- OTel-OTLP-Exporter-Python/1.31.1
|
||||
method: POST
|
||||
uri: https://telemetry.crewai.com:4319/v1/traces
|
||||
response:
|
||||
body:
|
||||
string: "\n\0"
|
||||
headers:
|
||||
Content-Length:
|
||||
- '2'
|
||||
Content-Type:
|
||||
- application/x-protobuf
|
||||
Date:
|
||||
- Sun, 25 May 2025 05:03:45 GMT
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
version: 1
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,4 +1,3 @@
|
||||
import pytest
|
||||
|
||||
from crewai.cli.constants import ENV_VARS, MODELS, PROVIDERS
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
from typing import Any, Dict, List, Optional, Union
|
||||
from unittest.mock import Mock
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@ import os
|
||||
from time import sleep
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import litellm
|
||||
import pytest
|
||||
from pydantic import BaseModel
|
||||
|
||||
@@ -222,7 +221,7 @@ def test_get_custom_llm_provider_gemini():
|
||||
|
||||
def test_get_custom_llm_provider_openai():
|
||||
llm = LLM(model="gpt-4")
|
||||
assert llm._get_custom_llm_provider() == None
|
||||
assert llm._get_custom_llm_provider() is None
|
||||
|
||||
|
||||
def test_validate_call_params_supported():
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
"""Tests for deterministic fingerprints in CrewAI components."""
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
import pytest
|
||||
|
||||
from crewai import Agent, Crew, Task
|
||||
from crewai.security import Fingerprint, SecurityConfig
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
"""Test for the examples in the fingerprinting documentation."""
|
||||
|
||||
import pytest
|
||||
|
||||
from crewai import Agent, Crew, Task
|
||||
from crewai.security import Fingerprint, SecurityConfig
|
||||
|
||||
@@ -5,7 +5,6 @@ import uuid
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import pytest
|
||||
from pydantic import ValidationError
|
||||
|
||||
from crewai.security import Fingerprint
|
||||
|
||||
@@ -223,7 +222,7 @@ def test_invalid_uuid_str():
|
||||
|
||||
# But this will raise an exception when we try to access the uuid property
|
||||
with pytest.raises(ValueError):
|
||||
uuid_obj = fingerprint.uuid
|
||||
fingerprint.uuid
|
||||
|
||||
|
||||
def test_fingerprint_metadata_mutation():
|
||||
@@ -260,4 +259,4 @@ def test_fingerprint_metadata_mutation():
|
||||
|
||||
# Ensure immutable fields remain unchanged
|
||||
assert fingerprint.uuid_str == uuid_str
|
||||
assert fingerprint.created_at == created_at
|
||||
assert fingerprint.created_at == created_at
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
"""Test integration of fingerprinting with Agent, Crew, and Task classes."""
|
||||
|
||||
import pytest
|
||||
|
||||
from crewai import Agent, Crew, Task
|
||||
from crewai.security import Fingerprint, SecurityConfig
|
||||
|
||||
@@ -67,9 +67,6 @@ def test_security_config_from_dict():
|
||||
}
|
||||
|
||||
# Create a config dict with just the fingerprint
|
||||
config_dict = {
|
||||
"fingerprint": fingerprint_dict
|
||||
}
|
||||
|
||||
# Create config manually since from_dict has a specific implementation
|
||||
config = SecurityConfig()
|
||||
@@ -115,4 +112,4 @@ def test_security_config_json_serialization():
|
||||
new_config.fingerprint = new_fingerprint
|
||||
|
||||
# Check the new config has the same fingerprint metadata
|
||||
assert new_config.fingerprint.metadata == {"version": "1.0"}
|
||||
assert new_config.fingerprint.metadata == {"version": "1.0"}
|
||||
|
||||
@@ -1,14 +1,10 @@
|
||||
import os
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
from mem0.client.main import MemoryClient
|
||||
from mem0.memory.main import Memory
|
||||
|
||||
from crewai.agent import Agent
|
||||
from crewai.crew import Crew
|
||||
from crewai.memory.storage.mem0_storage import Mem0Storage
|
||||
from crewai.task import Task
|
||||
|
||||
|
||||
# Define the class (if not already defined)
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
import os
|
||||
from typing import Dict
|
||||
|
||||
import pytest
|
||||
from pydantic import BaseModel
|
||||
|
||||
from crewai.flow.flow import Flow, FlowState, listen, start
|
||||
from crewai.flow.persistence import persist
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import asyncio
|
||||
from typing import cast
|
||||
from unittest.mock import Mock
|
||||
|
||||
@@ -313,5 +312,5 @@ def test_sets_parent_flow_when_inside_flow():
|
||||
nonlocal captured_agent
|
||||
captured_agent = source
|
||||
|
||||
result = flow.kickoff()
|
||||
flow.kickoff()
|
||||
assert captured_agent.parent_flow is flow
|
||||
|
||||
@@ -2,7 +2,6 @@ import os
|
||||
|
||||
import pytest
|
||||
|
||||
from crewai import LLM, Agent, Crew, Task
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="Only run manually with valid API keys")
|
||||
@@ -15,32 +14,29 @@ def test_multimodal_agent_with_image_url():
|
||||
if not OPENAI_API_KEY:
|
||||
pytest.skip("OPENAI_API_KEY environment variable not set")
|
||||
|
||||
llm = LLM(
|
||||
model="openai/gpt-4o", # model with vision capabilities
|
||||
api_key=OPENAI_API_KEY,
|
||||
temperature=0.7
|
||||
)
|
||||
# model="openai/gpt-4o", # model with vision capabilities
|
||||
# api_key=OPENAI_API_KEY,
|
||||
# temperature=0.7
|
||||
# )
|
||||
|
||||
expert_analyst = Agent(
|
||||
role="Visual Quality Inspector",
|
||||
goal="Perform detailed quality analysis of product images",
|
||||
backstory="Senior quality control expert with expertise in visual inspection",
|
||||
llm=llm,
|
||||
verbose=True,
|
||||
allow_delegation=False,
|
||||
multimodal=True
|
||||
)
|
||||
# role="Visual Quality Inspector",
|
||||
# goal="Perform detailed quality analysis of product images",
|
||||
# backstory="Senior quality control expert with expertise in visual inspection",
|
||||
# llm=llm,
|
||||
# verbose=True,
|
||||
# allow_delegation=False,
|
||||
# multimodal=True
|
||||
# )
|
||||
|
||||
inspection_task = Task(
|
||||
description="""
|
||||
Analyze the product image at https://www.us.maguireshoes.com/collections/spring-25/products/lucena-black-boot with focus on:
|
||||
1. Quality of materials
|
||||
2. Manufacturing defects
|
||||
3. Compliance with standards
|
||||
Provide a detailed report highlighting any issues found.
|
||||
""",
|
||||
expected_output="A detailed report highlighting any issues found",
|
||||
agent=expert_analyst
|
||||
)
|
||||
# description="""
|
||||
# Analyze the product image at https://www.us.maguireshoes.com/collections/spring-25/products/lucena-black-boot with focus on:
|
||||
# 1. Quality of materials
|
||||
# 2. Manufacturing defects
|
||||
# 3. Compliance with standards
|
||||
# Provide a detailed report highlighting any issues found.
|
||||
# """,
|
||||
# expected_output="A detailed report highlighting any issues found",
|
||||
# agent=None # Would reference the agent if test was active
|
||||
# )
|
||||
|
||||
crew = Crew(agents=[expert_analyst], tasks=[inspection_task])
|
||||
# This test is skipped, so we don't need to create or run a Crew
|
||||
|
||||
173
tests/tools/agent_tools/a2a_protocol_test.py
Normal file
173
tests/tools/agent_tools/a2a_protocol_test.py
Normal file
@@ -0,0 +1,173 @@
|
||||
"""Test for A2A protocol support in CrewAI."""
|
||||
|
||||
from unittest.mock import patch
|
||||
|
||||
from crewai.agent import Agent
|
||||
from crewai.tools.agent_tools.agent_tools import AgentTools
|
||||
from crewai.tools.agent_tools.delegate_work_tool import DelegateWorkTool
|
||||
from crewai.tools.agent_tools.ask_question_tool import AskQuestionTool
|
||||
from crewai.tools.base_tool import BaseTool
|
||||
|
||||
|
||||
def test_tools_passed_to_execute():
|
||||
"""Test that tools are properly passed to the _execute method."""
|
||||
tools_passed = {"value": False}
|
||||
|
||||
def mock_execute(self, agent_name, task, context=None, tools=None):
|
||||
assert tools is not None, "Tools should not be None"
|
||||
assert len(tools) > 0, "Tools should not be empty"
|
||||
assert any(isinstance(tool, DelegateWorkTool) for tool in tools), "DelegateWorkTool should be in tools"
|
||||
assert any(isinstance(tool, AskQuestionTool) for tool in tools), "AskQuestionTool should be in tools"
|
||||
tools_passed["value"] = True
|
||||
return "Task executed successfully"
|
||||
|
||||
researcher = Agent(
|
||||
role="researcher",
|
||||
goal="research and analyze content",
|
||||
backstory="You're an expert researcher",
|
||||
allow_delegation=True,
|
||||
)
|
||||
|
||||
writer = Agent(
|
||||
role="writer",
|
||||
goal="write content based on research",
|
||||
backstory="You're an expert writer",
|
||||
allow_delegation=True,
|
||||
)
|
||||
|
||||
agent_tools = AgentTools(agents=[researcher, writer])
|
||||
delegation_tools = agent_tools.tools()
|
||||
|
||||
with patch.object(DelegateWorkTool, '_execute', mock_execute):
|
||||
delegate_tool = delegation_tools[0] # DelegateWorkTool is the first tool
|
||||
assert isinstance(delegate_tool, DelegateWorkTool), "First tool should be DelegateWorkTool"
|
||||
|
||||
delegate_tool._run(
|
||||
task="Test task",
|
||||
context="Test context",
|
||||
coworker="writer",
|
||||
tools=delegation_tools
|
||||
)
|
||||
|
||||
assert tools_passed["value"], "Tools should be passed to _execute method"
|
||||
|
||||
|
||||
def test_tools_passed_from_ask_question_tool():
|
||||
"""Test that tools are properly passed from AskQuestionTool to _execute."""
|
||||
tools_passed = {"value": False}
|
||||
|
||||
def mock_execute(self, agent_name, question, context=None, tools=None):
|
||||
assert tools is not None, "Tools should not be None"
|
||||
assert len(tools) > 0, "Tools should not be empty"
|
||||
assert any(isinstance(tool, DelegateWorkTool) for tool in tools), "DelegateWorkTool should be in tools"
|
||||
assert any(isinstance(tool, AskQuestionTool) for tool in tools), "AskQuestionTool should be in tools"
|
||||
tools_passed["value"] = True
|
||||
return "Question answered successfully"
|
||||
|
||||
researcher = Agent(
|
||||
role="researcher",
|
||||
goal="research and analyze content",
|
||||
backstory="You're an expert researcher",
|
||||
allow_delegation=True,
|
||||
)
|
||||
|
||||
writer = Agent(
|
||||
role="writer",
|
||||
goal="write content based on research",
|
||||
backstory="You're an expert writer",
|
||||
allow_delegation=True,
|
||||
)
|
||||
|
||||
agent_tools = AgentTools(agents=[researcher, writer])
|
||||
delegation_tools = agent_tools.tools()
|
||||
|
||||
with patch.object(AskQuestionTool, '_execute', mock_execute):
|
||||
ask_tool = delegation_tools[1] # AskQuestionTool is the second tool
|
||||
assert isinstance(ask_tool, AskQuestionTool), "Second tool should be AskQuestionTool"
|
||||
|
||||
ask_tool._run(
|
||||
question="Test question",
|
||||
context="Test context",
|
||||
coworker="writer",
|
||||
tools=delegation_tools
|
||||
)
|
||||
|
||||
assert tools_passed["value"], "Tools should be passed to _execute method"
|
||||
|
||||
|
||||
def test_agent_tools_injects_tools():
|
||||
"""Test that AgentTools injects tools into delegation tools."""
|
||||
researcher = Agent(
|
||||
role="researcher",
|
||||
goal="research and analyze content",
|
||||
backstory="You're an expert researcher",
|
||||
allow_delegation=True,
|
||||
)
|
||||
|
||||
writer = Agent(
|
||||
role="writer",
|
||||
goal="write content based on research",
|
||||
backstory="You're an expert writer",
|
||||
allow_delegation=True,
|
||||
)
|
||||
|
||||
class CustomTool(BaseTool):
|
||||
name: str = "Custom Tool"
|
||||
description: str = "A custom tool for testing"
|
||||
|
||||
def _run(self, *args, **kwargs):
|
||||
return "Custom tool executed"
|
||||
|
||||
custom_tool = CustomTool()
|
||||
researcher.tools = [custom_tool]
|
||||
|
||||
agent_tools = AgentTools(agents=[researcher, writer])
|
||||
delegation_tools = agent_tools.tools()
|
||||
|
||||
for tool in delegation_tools:
|
||||
assert hasattr(tool, '_agent_tools'), "Tool should have _agent_tools attribute"
|
||||
assert len(tool._agent_tools) > 0, "Tool should have agent tools injected"
|
||||
assert any(isinstance(t, CustomTool) for t in tool._agent_tools), "Custom tool should be injected"
|
||||
|
||||
|
||||
def test_tool_deduplication():
|
||||
"""Test that tools are deduplicated when injected into delegation tools."""
|
||||
researcher = Agent(
|
||||
role="researcher",
|
||||
goal="research and analyze content",
|
||||
backstory="You're an expert researcher",
|
||||
allow_delegation=True,
|
||||
)
|
||||
|
||||
writer = Agent(
|
||||
role="writer",
|
||||
goal="write content based on research",
|
||||
backstory="You're an expert writer",
|
||||
allow_delegation=True,
|
||||
)
|
||||
|
||||
class CustomTool(BaseTool):
|
||||
name: str = "Custom Tool"
|
||||
description: str = "A custom tool for testing"
|
||||
|
||||
def _run(self, *args, **kwargs):
|
||||
return "Custom tool executed"
|
||||
|
||||
# Create two instances of the same tool
|
||||
custom_tool1 = CustomTool()
|
||||
custom_tool2 = CustomTool()
|
||||
|
||||
# Add the same tool to both agents
|
||||
researcher.tools = [custom_tool1]
|
||||
writer.tools = [custom_tool2]
|
||||
|
||||
agent_tools = AgentTools(agents=[researcher, writer])
|
||||
delegation_tools = agent_tools.tools()
|
||||
|
||||
# Check that tools are deduplicated
|
||||
for tool in delegation_tools:
|
||||
assert hasattr(tool, '_agent_tools'), "Tool should have _agent_tools attribute"
|
||||
|
||||
# Count instances of CustomTool
|
||||
custom_tools = [t for t in tool._agent_tools if isinstance(t, CustomTool)]
|
||||
assert len(custom_tools) <= 2, "Should have at most 2 instances of CustomTool"
|
||||
@@ -1,7 +1,5 @@
|
||||
import asyncio
|
||||
import inspect
|
||||
import unittest
|
||||
from typing import Any, Callable, Dict, List
|
||||
from typing import Callable
|
||||
from unittest.mock import patch
|
||||
|
||||
from crewai.tools import BaseTool, tool
|
||||
|
||||
@@ -476,7 +476,7 @@ def test_tool_selection_error_event_direct():
|
||||
def event_handler(source, event):
|
||||
received_events.append(event)
|
||||
|
||||
with pytest.raises(Exception) as exc_info:
|
||||
with pytest.raises(Exception):
|
||||
tool_usage._select_tool("Non Existent Tool")
|
||||
assert len(received_events) == 1
|
||||
event = received_events[0]
|
||||
@@ -490,7 +490,7 @@ def test_tool_selection_error_event_direct():
|
||||
assert "don't exist" in event.error
|
||||
|
||||
received_events.clear()
|
||||
with pytest.raises(Exception) as exc_info:
|
||||
with pytest.raises(Exception):
|
||||
tool_usage._select_tool("")
|
||||
|
||||
assert len(received_events) == 1
|
||||
@@ -563,7 +563,7 @@ def test_tool_validate_input_error_event():
|
||||
|
||||
# Test invalid input
|
||||
invalid_input = "invalid json {[}"
|
||||
with pytest.raises(Exception) as exc_info:
|
||||
with pytest.raises(Exception):
|
||||
tool_usage._validate_tool_input(invalid_input)
|
||||
|
||||
# Verify event was emitted
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
import unittest
|
||||
from typing import Any, Dict, List, Union
|
||||
|
||||
import pytest
|
||||
|
||||
from crewai.utilities.chromadb import (
|
||||
MAX_COLLECTION_LENGTH,
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
from typing import Optional
|
||||
from unittest.mock import MagicMock, patch
|
||||
from unittest.mock import patch
|
||||
|
||||
import pytest
|
||||
from pydantic import BaseModel
|
||||
|
||||
from crewai.agent import Agent
|
||||
from crewai.knowledge.source.string_knowledge_source import StringKnowledgeSource
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
from typing import Any, Dict, List, Optional, Set, Tuple, Union
|
||||
from typing import Dict, List, Optional, Union
|
||||
|
||||
import pytest
|
||||
from pydantic import BaseModel, Field
|
||||
from pydantic import BaseModel
|
||||
|
||||
from crewai.utilities.pydantic_schema_parser import PydanticSchemaParser
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from datetime import date, datetime
|
||||
from typing import List
|
||||
from unittest.mock import Mock
|
||||
|
||||
import pytest
|
||||
from pydantic import BaseModel
|
||||
|
||||
Reference in New Issue
Block a user