mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-22 22:58:13 +00:00
Merge branch 'feature/kickoff-consistent-output' of https://github.com/bhancockio/crewAI into temp-feature/replay_from_task
This commit is contained in:
@@ -4,6 +4,10 @@ from unittest import mock
|
||||
from unittest.mock import patch
|
||||
|
||||
import pytest
|
||||
from langchain.tools import tool
|
||||
from langchain_core.exceptions import OutputParserException
|
||||
from langchain_openai import ChatOpenAI
|
||||
|
||||
from crewai import Agent, Crew, Task
|
||||
from crewai.agents.cache import CacheHandler
|
||||
from crewai.agents.executor import CrewAgentExecutor
|
||||
@@ -11,9 +15,6 @@ from crewai.agents.parser import CrewAgentParser
|
||||
from crewai.tools.tool_calling import InstructorToolCalling
|
||||
from crewai.tools.tool_usage import ToolUsage
|
||||
from crewai.utilities import RPMController
|
||||
from langchain.tools import tool
|
||||
from langchain_core.exceptions import OutputParserException
|
||||
from langchain_openai import ChatOpenAI
|
||||
|
||||
|
||||
def test_agent_creation():
|
||||
@@ -630,8 +631,9 @@ def test_agent_use_specific_tasks_output_as_context(capsys):
|
||||
|
||||
crew = Crew(agents=[agent1, agent2], tasks=tasks)
|
||||
result = crew.kickoff()
|
||||
assert "bye" not in result.raw_output().lower()
|
||||
assert "hi" in result.raw_output().lower() or "hello" in result.raw_output().lower()
|
||||
print("LOWER RESULT", result.raw)
|
||||
assert "bye" not in result.raw.lower()
|
||||
assert "hi" in result.raw.lower() or "hello" in result.raw.lower()
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
@@ -643,7 +645,7 @@ def test_agent_step_callback():
|
||||
with patch.object(StepCallback, "callback") as callback:
|
||||
|
||||
@tool
|
||||
def learn_about_AI(topic) -> float:
|
||||
def learn_about_AI(topic) -> str:
|
||||
"""Useful for when you need to learn about AI to write an paragraph about it."""
|
||||
return "AI is a very broad field."
|
||||
|
||||
@@ -677,7 +679,7 @@ def test_agent_function_calling_llm():
|
||||
with patch.object(llm.client, "create", wraps=llm.client.create) as private_mock:
|
||||
|
||||
@tool
|
||||
def learn_about_AI(topic) -> float:
|
||||
def learn_about_AI(topic) -> str:
|
||||
"""Useful for when you need to learn about AI to write an paragraph about it."""
|
||||
return "AI is a very broad field."
|
||||
|
||||
@@ -749,8 +751,8 @@ def test_tool_result_as_answer_is_the_final_answer_for_the_agent():
|
||||
crew = Crew(agents=[agent1], tasks=tasks)
|
||||
|
||||
result = crew.kickoff()
|
||||
print("RESULT: ", result.raw_output())
|
||||
assert result.raw_output() == "Howdy!"
|
||||
print("RESULT: ", result.raw)
|
||||
assert result.raw == "Howdy!"
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
|
||||
1431
tests/cassettes/test_crew_kickoff_usage_metrics.yaml
Normal file
1431
tests/cassettes/test_crew_kickoff_usage_metrics.yaml
Normal file
File diff suppressed because it is too large
Load Diff
1464
tests/cassettes/test_kickoff_for_each_multiple_inputs.yaml
Normal file
1464
tests/cassettes/test_kickoff_for_each_multiple_inputs.yaml
Normal file
File diff suppressed because it is too large
Load Diff
192
tests/cassettes/test_kickoff_for_each_single_input.yaml
Normal file
192
tests/cassettes/test_kickoff_for_each_single_input.yaml
Normal file
@@ -0,0 +1,192 @@
|
||||
interactions:
|
||||
- request:
|
||||
body: '{"messages": [{"content": "You are dog Researcher. You have a lot of experience
|
||||
with dog.\nYour personal goal is: Express hot takes on dog.To give my best complete
|
||||
final answer to the task use the exact following format:\n\nThought: I now can
|
||||
give a great answer\nFinal Answer: my best complete final answer to the task.\nYour
|
||||
final answer must be the great and the most complete as possible, it must be
|
||||
outcome described.\n\nI MUST use these formats, my job depends on it!\nCurrent
|
||||
Task: Give me an analysis around dog.\n\nThis is the expect criteria for your
|
||||
final answer: 1 bullet point about dog that''s under 15 words. \n you MUST return
|
||||
the actual complete content as the final answer, not a summary.\n\nBegin! This
|
||||
is VERY important to you, use the tools available and give your best Final Answer,
|
||||
your job depends on it!\n\nThought:\n", "role": "user"}], "model": "gpt-4o",
|
||||
"n": 1, "stop": ["\nObservation"], "stream": true, "temperature": 0.7}'
|
||||
headers:
|
||||
accept:
|
||||
- application/json
|
||||
accept-encoding:
|
||||
- gzip, deflate
|
||||
connection:
|
||||
- keep-alive
|
||||
content-length:
|
||||
- '951'
|
||||
content-type:
|
||||
- application/json
|
||||
host:
|
||||
- api.openai.com
|
||||
user-agent:
|
||||
- OpenAI/Python 1.35.10
|
||||
x-stainless-arch:
|
||||
- arm64
|
||||
x-stainless-async:
|
||||
- 'false'
|
||||
x-stainless-lang:
|
||||
- python
|
||||
x-stainless-os:
|
||||
- MacOS
|
||||
x-stainless-package-version:
|
||||
- 1.35.10
|
||||
x-stainless-runtime:
|
||||
- CPython
|
||||
x-stainless-runtime-version:
|
||||
- 3.12.3
|
||||
method: POST
|
||||
uri: https://api.openai.com/v1/chat/completions
|
||||
response:
|
||||
body:
|
||||
string: 'data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"role":"assistant","content":""},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"Thought"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
I"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
now"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
can"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
give"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
a"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
great"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
answer"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"\n"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"Final"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
Answer"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
Dogs"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
are"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
unparalleled"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
in"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
loyalty"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
and"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
companionship"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
to"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"
|
||||
humans"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9j74gJiY9YxFxbeZ5jmpPclWEeaiP","object":"chat.completion.chunk","created":1720538982,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_4008e3b719","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}]}
|
||||
|
||||
|
||||
data: [DONE]
|
||||
|
||||
|
||||
'
|
||||
headers:
|
||||
CF-Cache-Status:
|
||||
- DYNAMIC
|
||||
CF-RAY:
|
||||
- 8a0959de6b916783-ATL
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Type:
|
||||
- text/event-stream; charset=utf-8
|
||||
Date:
|
||||
- Tue, 09 Jul 2024 15:29:42 GMT
|
||||
Server:
|
||||
- cloudflare
|
||||
Set-Cookie:
|
||||
- __cf_bm=LA.xC.jE_aMjiSgGgU6kDsBPhb_akgqn_4Rx.jXYfnQ-1720538982-1.0.1.1-l5Q1BHprIz5Jxb4HWyYsMfbg6mEnP2H95Vxt89ez24pKOb__90s8LJBBqK52zmPNcPYSSUcaR0wRAaSVFoa4Fw;
|
||||
path=/; expires=Tue, 09-Jul-24 15:59:42 GMT; domain=.api.openai.com; HttpOnly;
|
||||
Secure; SameSite=None
|
||||
- _cfuvid=zzJ51X.VwRkIq7VLCg9xPQGbXoUmAH6b.2g6sf6Y58Y-1720538982657-0.0.1.1-604800000;
|
||||
path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
|
||||
Transfer-Encoding:
|
||||
- chunked
|
||||
alt-svc:
|
||||
- h3=":443"; ma=86400
|
||||
openai-organization:
|
||||
- crewai-iuxna1
|
||||
openai-processing-ms:
|
||||
- '240'
|
||||
openai-version:
|
||||
- '2020-10-01'
|
||||
strict-transport-security:
|
||||
- max-age=31536000; includeSubDomains
|
||||
x-ratelimit-limit-requests:
|
||||
- '10000'
|
||||
x-ratelimit-limit-tokens:
|
||||
- '22000000'
|
||||
x-ratelimit-remaining-requests:
|
||||
- '9999'
|
||||
x-ratelimit-remaining-tokens:
|
||||
- '21999783'
|
||||
x-ratelimit-reset-requests:
|
||||
- 6ms
|
||||
x-ratelimit-reset-tokens:
|
||||
- 0s
|
||||
x-request-id:
|
||||
- req_abdec68aded596628dfd5b999919447d
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
version: 1
|
||||
1209
tests/cassettes/test_output_json_dict_hierarchical.yaml
Normal file
1209
tests/cassettes/test_output_json_dict_hierarchical.yaml
Normal file
File diff suppressed because it is too large
Load Diff
453
tests/cassettes/test_output_json_dict_sequential.yaml
Normal file
453
tests/cassettes/test_output_json_dict_sequential.yaml
Normal file
@@ -0,0 +1,453 @@
|
||||
interactions:
|
||||
- request:
|
||||
body: '{"messages": [{"content": "You are Scorer. You''re an expert scorer, specialized
|
||||
in scoring titles.\nYour personal goal is: Score the titleTo give my best complete
|
||||
final answer to the task use the exact following format:\n\nThought: I now can
|
||||
give a great answer\nFinal Answer: my best complete final answer to the task.\nYour
|
||||
final answer must be the great and the most complete as possible, it must be
|
||||
outcome described.\n\nI MUST use these formats, my job depends on it!\nCurrent
|
||||
Task: Give me an integer score between 1-5 for the following title: ''The impact
|
||||
of AI in the future of work''\n\nThis is the expect criteria for your final
|
||||
answer: The score of the title. \n you MUST return the actual complete content
|
||||
as the final answer, not a summary.\n\nBegin! This is VERY important to you,
|
||||
use the tools available and give your best Final Answer, your job depends on
|
||||
it!\n\nThought:\n", "role": "user"}], "model": "gpt-4o", "n": 1, "stop": ["\nObservation"],
|
||||
"stream": true, "temperature": 0.7}'
|
||||
headers:
|
||||
accept:
|
||||
- application/json
|
||||
accept-encoding:
|
||||
- gzip, deflate
|
||||
connection:
|
||||
- keep-alive
|
||||
content-length:
|
||||
- '997'
|
||||
content-type:
|
||||
- application/json
|
||||
host:
|
||||
- api.openai.com
|
||||
user-agent:
|
||||
- OpenAI/Python 1.35.10
|
||||
x-stainless-arch:
|
||||
- arm64
|
||||
x-stainless-async:
|
||||
- 'false'
|
||||
x-stainless-lang:
|
||||
- python
|
||||
x-stainless-os:
|
||||
- MacOS
|
||||
x-stainless-package-version:
|
||||
- 1.35.10
|
||||
x-stainless-runtime:
|
||||
- CPython
|
||||
x-stainless-runtime-version:
|
||||
- 3.12.3
|
||||
method: POST
|
||||
uri: https://api.openai.com/v1/chat/completions
|
||||
response:
|
||||
body:
|
||||
string: 'data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"role":"assistant","content":""},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"I"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
now"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
can"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
give"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
a"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
great"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
answer"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"\n"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"Final"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
Answer"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJmkP063CQ01vF8ENhkPSwN9BQH","object":"chat.completion.chunk","created":1720559138,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}]}
|
||||
|
||||
|
||||
data: [DONE]
|
||||
|
||||
|
||||
'
|
||||
headers:
|
||||
CF-Cache-Status:
|
||||
- DYNAMIC
|
||||
CF-RAY:
|
||||
- 8a0b45f368ab6734-ATL
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Type:
|
||||
- text/event-stream; charset=utf-8
|
||||
Date:
|
||||
- Tue, 09 Jul 2024 21:05:38 GMT
|
||||
Server:
|
||||
- cloudflare
|
||||
Set-Cookie:
|
||||
- __cf_bm=43lNOCqE3W6gMhKEVIvu20BhU4nI7wyQYcgn28hcb3o-1720559138-1.0.1.1-2pdG6KFn0J2AHC_tnhcxXCqmZ_RyZfwthLi5ET6Aq4v1L9z3EcYxV1D1CeKjOgEBJPLD9GUDdMmIR3h86QYx7w;
|
||||
path=/; expires=Tue, 09-Jul-24 21:35:38 GMT; domain=.api.openai.com; HttpOnly;
|
||||
Secure; SameSite=None
|
||||
- _cfuvid=T4YvZnF6fWjq7JTPVyPFDIHaXBpT8E23GcG55Q0Ky6A-1720559138248-0.0.1.1-604800000;
|
||||
path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
|
||||
Transfer-Encoding:
|
||||
- chunked
|
||||
alt-svc:
|
||||
- h3=":443"; ma=86400
|
||||
openai-organization:
|
||||
- crewai-iuxna1
|
||||
openai-processing-ms:
|
||||
- '159'
|
||||
openai-version:
|
||||
- '2020-10-01'
|
||||
strict-transport-security:
|
||||
- max-age=31536000; includeSubDomains
|
||||
x-ratelimit-limit-requests:
|
||||
- '10000'
|
||||
x-ratelimit-limit-tokens:
|
||||
- '22000000'
|
||||
x-ratelimit-remaining-requests:
|
||||
- '9999'
|
||||
x-ratelimit-remaining-tokens:
|
||||
- '21999771'
|
||||
x-ratelimit-reset-requests:
|
||||
- 6ms
|
||||
x-ratelimit-reset-tokens:
|
||||
- 0s
|
||||
x-request-id:
|
||||
- req_a58604fe17d3de5d4491ec972e98312b
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
- request:
|
||||
body: '{"messages": [{"role": "user", "content": "4"}, {"role": "system", "content":
|
||||
"I''m gonna convert this raw text into valid JSON."}], "model": "gpt-4o", "tool_choice":
|
||||
{"type": "function", "function": {"name": "ScoreOutput"}}, "tools": [{"type":
|
||||
"function", "function": {"name": "ScoreOutput", "description": "Correctly extracted
|
||||
`ScoreOutput` with all the required parameters with correct types", "parameters":
|
||||
{"properties": {"score": {"title": "Score", "type": "integer"}}, "required":
|
||||
["score"], "type": "object"}}}]}'
|
||||
headers:
|
||||
accept:
|
||||
- application/json
|
||||
accept-encoding:
|
||||
- gzip, deflate
|
||||
connection:
|
||||
- keep-alive
|
||||
content-length:
|
||||
- '519'
|
||||
content-type:
|
||||
- application/json
|
||||
cookie:
|
||||
- __cf_bm=43lNOCqE3W6gMhKEVIvu20BhU4nI7wyQYcgn28hcb3o-1720559138-1.0.1.1-2pdG6KFn0J2AHC_tnhcxXCqmZ_RyZfwthLi5ET6Aq4v1L9z3EcYxV1D1CeKjOgEBJPLD9GUDdMmIR3h86QYx7w;
|
||||
_cfuvid=T4YvZnF6fWjq7JTPVyPFDIHaXBpT8E23GcG55Q0Ky6A-1720559138248-0.0.1.1-604800000
|
||||
host:
|
||||
- api.openai.com
|
||||
user-agent:
|
||||
- OpenAI/Python 1.35.10
|
||||
x-stainless-arch:
|
||||
- arm64
|
||||
x-stainless-async:
|
||||
- 'false'
|
||||
x-stainless-lang:
|
||||
- python
|
||||
x-stainless-os:
|
||||
- MacOS
|
||||
x-stainless-package-version:
|
||||
- 1.35.10
|
||||
x-stainless-runtime:
|
||||
- CPython
|
||||
x-stainless-runtime-version:
|
||||
- 3.12.3
|
||||
method: POST
|
||||
uri: https://api.openai.com/v1/chat/completions
|
||||
response:
|
||||
body:
|
||||
string: !!binary |
|
||||
H4sIAAAAAAAAA2xSTW/bMAy9+1cIPMeDncRL7Gt2GNJhOWzdDmthKIriqJFETaK7FkH++yDHjd2g
|
||||
PggEH98HSJ8SxkDtoGIgDpyEcTotn1Zr8/1lvViV9+rY6ru/zhW/8i+HpvA/YRIZuH2Sgt5YnwQa
|
||||
pyUptBdYeMlJRtV8Mc2Kosxnyw4wuJM60hpH6RzTaTadp1mR5rOeeEAlZICK/UkYY+zUvTGi3ckX
|
||||
qFg2eesYGQJvJFTXIcbAo44d4CGoQNwSTAZQoCVpY2rbaj0CCFHXgms9GF++06ge9sS1rk3Y/Cvv
|
||||
Nq75upx+Pj7/vsfnb2ta6ZHfRfrVdYH2rRXX/Yzwa7+6MWMMLDcd94dALzctuZZu6IwB901rpKUY
|
||||
HU4PEOLwA1TzM7wbPScf1Y99db6uVWPjPG7DzZZgr6wKh9pLHrq0EAjdxSLKPXbna99dBJxH46gm
|
||||
PEobBZf99WD4Xwaw6DFC4nrEKZI+HoTXQNLUe2Ub6Z1X3Slh7+p5li3lbLvIS0jOyX8AAAD//wMA
|
||||
s5wGAdMCAAA=
|
||||
headers:
|
||||
CF-Cache-Status:
|
||||
- DYNAMIC
|
||||
CF-RAY:
|
||||
- 8a0b45f828146734-ATL
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Encoding:
|
||||
- gzip
|
||||
Content-Type:
|
||||
- application/json
|
||||
Date:
|
||||
- Tue, 09 Jul 2024 21:05:38 GMT
|
||||
Server:
|
||||
- cloudflare
|
||||
Transfer-Encoding:
|
||||
- chunked
|
||||
alt-svc:
|
||||
- h3=":443"; ma=86400
|
||||
openai-organization:
|
||||
- crewai-iuxna1
|
||||
openai-processing-ms:
|
||||
- '215'
|
||||
openai-version:
|
||||
- '2020-10-01'
|
||||
strict-transport-security:
|
||||
- max-age=31536000; includeSubDomains
|
||||
x-ratelimit-limit-requests:
|
||||
- '10000'
|
||||
x-ratelimit-limit-tokens:
|
||||
- '22000000'
|
||||
x-ratelimit-remaining-requests:
|
||||
- '9999'
|
||||
x-ratelimit-remaining-tokens:
|
||||
- '21999969'
|
||||
x-ratelimit-reset-requests:
|
||||
- 6ms
|
||||
x-ratelimit-reset-tokens:
|
||||
- 0s
|
||||
x-request-id:
|
||||
- req_34b28faf23b6422bb0855e6a45c65e92
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
- request:
|
||||
body: '{"input": ["examples(Examples): Specific scenarios used to explain counting,
|
||||
addition, and subtraction through the zoo theme, such as counting animals, adding
|
||||
new ones, and subtracting adopted ones."], "model": "text-embedding-ada-002",
|
||||
"encoding_format": "base64"}'
|
||||
headers:
|
||||
accept:
|
||||
- application/json
|
||||
accept-encoding:
|
||||
- gzip, deflate
|
||||
connection:
|
||||
- keep-alive
|
||||
content-length:
|
||||
- '265'
|
||||
content-type:
|
||||
- application/json
|
||||
host:
|
||||
- api.openai.com
|
||||
user-agent:
|
||||
- OpenAI/Python 1.35.10
|
||||
x-stainless-arch:
|
||||
- arm64
|
||||
x-stainless-async:
|
||||
- 'false'
|
||||
x-stainless-lang:
|
||||
- python
|
||||
x-stainless-os:
|
||||
- MacOS
|
||||
x-stainless-package-version:
|
||||
- 1.35.10
|
||||
x-stainless-runtime:
|
||||
- CPython
|
||||
x-stainless-runtime-version:
|
||||
- 3.12.3
|
||||
method: POST
|
||||
uri: https://api.openai.com/v1/embeddings
|
||||
response:
|
||||
body:
|
||||
string: !!binary |
|
||||
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
|
||||
AA==
|
||||
headers:
|
||||
CF-Cache-Status:
|
||||
- DYNAMIC
|
||||
CF-RAY:
|
||||
- 8a0b45f9bc6c4589-ATL
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Encoding:
|
||||
- gzip
|
||||
Content-Type:
|
||||
- application/json
|
||||
Date:
|
||||
- Tue, 09 Jul 2024 21:05:39 GMT
|
||||
Server:
|
||||
- cloudflare
|
||||
Set-Cookie:
|
||||
- __cf_bm=IuvCm3DYH_Yj2KCjQfa873zjAj_2TgaF47eD6tQ4Mhs-1720559139-1.0.1.1-fWDjNt6ARNNwSwU4ZoyX.VoMhynDVIi97V54zsXBMuMg_KjRGid.vTsH.YWP4cEbPWj_vdlZjnfl3ef4S90Eog;
|
||||
path=/; expires=Tue, 09-Jul-24 21:35:39 GMT; domain=.api.openai.com; HttpOnly;
|
||||
Secure; SameSite=None
|
||||
- _cfuvid=uolQOZ2C52Hd5W7TXNWyFaYk4FEIIwP0B2MH49GGYtA-1720559139009-0.0.1.1-604800000;
|
||||
path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
|
||||
Transfer-Encoding:
|
||||
- chunked
|
||||
access-control-allow-origin:
|
||||
- '*'
|
||||
alt-svc:
|
||||
- h3=":443"; ma=86400
|
||||
openai-model:
|
||||
- text-embedding-ada-002
|
||||
openai-organization:
|
||||
- crewai-iuxna1
|
||||
openai-processing-ms:
|
||||
- '18'
|
||||
openai-version:
|
||||
- '2020-10-01'
|
||||
strict-transport-security:
|
||||
- max-age=31536000; includeSubDomains
|
||||
x-ratelimit-limit-requests:
|
||||
- '10000'
|
||||
x-ratelimit-limit-tokens:
|
||||
- '10000000'
|
||||
x-ratelimit-remaining-requests:
|
||||
- '9999'
|
||||
x-ratelimit-remaining-tokens:
|
||||
- '9999953'
|
||||
x-ratelimit-reset-requests:
|
||||
- 6ms
|
||||
x-ratelimit-reset-tokens:
|
||||
- 0s
|
||||
x-request-id:
|
||||
- req_5f80532d772393d55159f71cbd4e8211
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
version: 1
|
||||
1516
tests/cassettes/test_output_json_hierarchical.yaml
Normal file
1516
tests/cassettes/test_output_json_hierarchical.yaml
Normal file
File diff suppressed because it is too large
Load Diff
258
tests/cassettes/test_output_json_sequential.yaml
Normal file
258
tests/cassettes/test_output_json_sequential.yaml
Normal file
@@ -0,0 +1,258 @@
|
||||
interactions:
|
||||
- request:
|
||||
body: '{"messages": [{"content": "You are Scorer. You''re an expert scorer, specialized
|
||||
in scoring titles.\nYour personal goal is: Score the titleTo give my best complete
|
||||
final answer to the task use the exact following format:\n\nThought: I now can
|
||||
give a great answer\nFinal Answer: my best complete final answer to the task.\nYour
|
||||
final answer must be the great and the most complete as possible, it must be
|
||||
outcome described.\n\nI MUST use these formats, my job depends on it!\nCurrent
|
||||
Task: Give me an integer score between 1-5 for the following title: ''The impact
|
||||
of AI in the future of work''\n\nThis is the expect criteria for your final
|
||||
answer: The score of the title. \n you MUST return the actual complete content
|
||||
as the final answer, not a summary.\n\nBegin! This is VERY important to you,
|
||||
use the tools available and give your best Final Answer, your job depends on
|
||||
it!\n\nThought:\n", "role": "user"}], "model": "gpt-4o", "n": 1, "stop": ["\nObservation"],
|
||||
"stream": true, "temperature": 0.7}'
|
||||
headers:
|
||||
accept:
|
||||
- application/json
|
||||
accept-encoding:
|
||||
- gzip, deflate
|
||||
connection:
|
||||
- keep-alive
|
||||
content-length:
|
||||
- '997'
|
||||
content-type:
|
||||
- application/json
|
||||
host:
|
||||
- api.openai.com
|
||||
user-agent:
|
||||
- OpenAI/Python 1.35.10
|
||||
x-stainless-arch:
|
||||
- arm64
|
||||
x-stainless-async:
|
||||
- 'false'
|
||||
x-stainless-lang:
|
||||
- python
|
||||
x-stainless-os:
|
||||
- MacOS
|
||||
x-stainless-package-version:
|
||||
- 1.35.10
|
||||
x-stainless-runtime:
|
||||
- CPython
|
||||
x-stainless-runtime-version:
|
||||
- 3.12.3
|
||||
method: POST
|
||||
uri: https://api.openai.com/v1/chat/completions
|
||||
response:
|
||||
body:
|
||||
string: 'data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"role":"assistant","content":""},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"Thought"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
I"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
now"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
can"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
give"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
a"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
great"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
answer"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"\n"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"Final"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
Answer"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"
|
||||
"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJkXh6z3EfmS24VIKd3az5QmUI6","object":"chat.completion.chunk","created":1720559136,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_d576307f90","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}]}
|
||||
|
||||
|
||||
data: [DONE]
|
||||
|
||||
|
||||
'
|
||||
headers:
|
||||
CF-Cache-Status:
|
||||
- DYNAMIC
|
||||
CF-RAY:
|
||||
- 8a0b45eb19a3c00b-ATL
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Type:
|
||||
- text/event-stream; charset=utf-8
|
||||
Date:
|
||||
- Tue, 09 Jul 2024 21:05:36 GMT
|
||||
Server:
|
||||
- cloudflare
|
||||
Set-Cookie:
|
||||
- __cf_bm=pA7SjF9QjLel4TzQ_lNj63W_TlcZBVsYreOxByhCguY-1720559136-1.0.1.1-HZhSIVb4ZIrgcL3DwhR7q53vNdieKNmEv_0ZAHDbmBBkD891hDrzxqLpBZSw7j_mFtCPQEjxpAMjD5JI3o8NEw;
|
||||
path=/; expires=Tue, 09-Jul-24 21:35:36 GMT; domain=.api.openai.com; HttpOnly;
|
||||
Secure; SameSite=None
|
||||
- _cfuvid=OblnrTSQSq8R858tQhKPz9cFRCWv.MPPI1wxnvjeHJI-1720559136855-0.0.1.1-604800000;
|
||||
path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
|
||||
Transfer-Encoding:
|
||||
- chunked
|
||||
alt-svc:
|
||||
- h3=":443"; ma=86400
|
||||
openai-organization:
|
||||
- crewai-iuxna1
|
||||
openai-processing-ms:
|
||||
- '96'
|
||||
openai-version:
|
||||
- '2020-10-01'
|
||||
strict-transport-security:
|
||||
- max-age=31536000; includeSubDomains
|
||||
x-ratelimit-limit-requests:
|
||||
- '10000'
|
||||
x-ratelimit-limit-tokens:
|
||||
- '22000000'
|
||||
x-ratelimit-remaining-requests:
|
||||
- '9999'
|
||||
x-ratelimit-remaining-tokens:
|
||||
- '21999771'
|
||||
x-ratelimit-reset-requests:
|
||||
- 6ms
|
||||
x-ratelimit-reset-tokens:
|
||||
- 0s
|
||||
x-request-id:
|
||||
- req_ee2fc8fd37b03ee0bcf92ff34f91a51c
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
- request:
|
||||
body: '{"messages": [{"role": "user", "content": "4"}, {"role": "system", "content":
|
||||
"I''m gonna convert this raw text into valid JSON."}], "model": "gpt-4o", "tool_choice":
|
||||
{"type": "function", "function": {"name": "ScoreOutput"}}, "tools": [{"type":
|
||||
"function", "function": {"name": "ScoreOutput", "description": "Correctly extracted
|
||||
`ScoreOutput` with all the required parameters with correct types", "parameters":
|
||||
{"properties": {"score": {"title": "Score", "type": "integer"}}, "required":
|
||||
["score"], "type": "object"}}}]}'
|
||||
headers:
|
||||
accept:
|
||||
- application/json
|
||||
accept-encoding:
|
||||
- gzip, deflate
|
||||
connection:
|
||||
- keep-alive
|
||||
content-length:
|
||||
- '519'
|
||||
content-type:
|
||||
- application/json
|
||||
cookie:
|
||||
- __cf_bm=pA7SjF9QjLel4TzQ_lNj63W_TlcZBVsYreOxByhCguY-1720559136-1.0.1.1-HZhSIVb4ZIrgcL3DwhR7q53vNdieKNmEv_0ZAHDbmBBkD891hDrzxqLpBZSw7j_mFtCPQEjxpAMjD5JI3o8NEw;
|
||||
_cfuvid=OblnrTSQSq8R858tQhKPz9cFRCWv.MPPI1wxnvjeHJI-1720559136855-0.0.1.1-604800000
|
||||
host:
|
||||
- api.openai.com
|
||||
user-agent:
|
||||
- OpenAI/Python 1.35.10
|
||||
x-stainless-arch:
|
||||
- arm64
|
||||
x-stainless-async:
|
||||
- 'false'
|
||||
x-stainless-lang:
|
||||
- python
|
||||
x-stainless-os:
|
||||
- MacOS
|
||||
x-stainless-package-version:
|
||||
- 1.35.10
|
||||
x-stainless-runtime:
|
||||
- CPython
|
||||
x-stainless-runtime-version:
|
||||
- 3.12.3
|
||||
method: POST
|
||||
uri: https://api.openai.com/v1/chat/completions
|
||||
response:
|
||||
body:
|
||||
string: !!binary |
|
||||
H4sIAAAAAAAAA2xS22rjMBB991eIeY4X5+K68WsoXbplt6WUQjfFKIp8SWSNkMabpiH/XuS4sRvW
|
||||
D2KYM+fCjA8BY1CtIWUgSk6iNiqcbxZ3anfPy6sPnu92k23iVvttUl7/XPz+BSPPwNVGCvpi/RBY
|
||||
GyWpQn2ChZWcpFcdJ5MojufjadICNa6l8rTCUDjDcBJNZmEUh+NpRyyxEtJByv4GjDF2aF8fUa/l
|
||||
O6QsGn11aukcLySk5yHGwKLyHeDOVY64Jhj1oEBNUvvUulFqABCiygRXqjc+fYdB3e+JK5Wtdrc3
|
||||
L83Y7h8Xm4/7l3/b13nx8Hz3MPA7Se9NGyhvtDjvZ4Cf++mFGWOged1ynwRa+ach09AFnTHgtmhq
|
||||
qclHh8MSnB9eQjo7wrfRY/C/+q2rjue1KiyMxZW72BLkla5cmVnJXZsWHKE5WXi5t/Z8zbeLgLFY
|
||||
G8oIt1J7wevuetD/Lz0YdxghcTXgxEEXD9zekayzvNKFtMZW7SkhN9k6Tq6mUZLPIwiOwScAAAD/
|
||||
/wMAE8hqg9MCAAA=
|
||||
headers:
|
||||
CF-Cache-Status:
|
||||
- DYNAMIC
|
||||
CF-RAY:
|
||||
- 8a0b45ef8871c00b-ATL
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Encoding:
|
||||
- gzip
|
||||
Content-Type:
|
||||
- application/json
|
||||
Date:
|
||||
- Tue, 09 Jul 2024 21:05:37 GMT
|
||||
Server:
|
||||
- cloudflare
|
||||
Transfer-Encoding:
|
||||
- chunked
|
||||
alt-svc:
|
||||
- h3=":443"; ma=86400
|
||||
openai-organization:
|
||||
- crewai-iuxna1
|
||||
openai-processing-ms:
|
||||
- '298'
|
||||
openai-version:
|
||||
- '2020-10-01'
|
||||
strict-transport-security:
|
||||
- max-age=31536000; includeSubDomains
|
||||
x-ratelimit-limit-requests:
|
||||
- '10000'
|
||||
x-ratelimit-limit-tokens:
|
||||
- '22000000'
|
||||
x-ratelimit-remaining-requests:
|
||||
- '9999'
|
||||
x-ratelimit-remaining-tokens:
|
||||
- '21999969'
|
||||
x-ratelimit-reset-requests:
|
||||
- 6ms
|
||||
x-ratelimit-reset-tokens:
|
||||
- 0s
|
||||
x-request-id:
|
||||
- req_cea16690999d7a4128fd55687dc31397
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
version: 1
|
||||
1649
tests/cassettes/test_output_pydantic_hierarchical.yaml
Normal file
1649
tests/cassettes/test_output_pydantic_hierarchical.yaml
Normal file
File diff suppressed because it is too large
Load Diff
258
tests/cassettes/test_output_pydantic_sequential.yaml
Normal file
258
tests/cassettes/test_output_pydantic_sequential.yaml
Normal file
@@ -0,0 +1,258 @@
|
||||
interactions:
|
||||
- request:
|
||||
body: '{"messages": [{"content": "You are Scorer. You''re an expert scorer, specialized
|
||||
in scoring titles.\nYour personal goal is: Score the titleTo give my best complete
|
||||
final answer to the task use the exact following format:\n\nThought: I now can
|
||||
give a great answer\nFinal Answer: my best complete final answer to the task.\nYour
|
||||
final answer must be the great and the most complete as possible, it must be
|
||||
outcome described.\n\nI MUST use these formats, my job depends on it!\nCurrent
|
||||
Task: Give me an integer score between 1-5 for the following title: ''The impact
|
||||
of AI in the future of work''\n\nThis is the expect criteria for your final
|
||||
answer: The score of the title. \n you MUST return the actual complete content
|
||||
as the final answer, not a summary.\n\nBegin! This is VERY important to you,
|
||||
use the tools available and give your best Final Answer, your job depends on
|
||||
it!\n\nThought:\n", "role": "user"}], "model": "gpt-4o", "n": 1, "stop": ["\nObservation"],
|
||||
"stream": true, "temperature": 0.7}'
|
||||
headers:
|
||||
accept:
|
||||
- application/json
|
||||
accept-encoding:
|
||||
- gzip, deflate
|
||||
connection:
|
||||
- keep-alive
|
||||
content-length:
|
||||
- '997'
|
||||
content-type:
|
||||
- application/json
|
||||
host:
|
||||
- api.openai.com
|
||||
user-agent:
|
||||
- OpenAI/Python 1.35.10
|
||||
x-stainless-arch:
|
||||
- arm64
|
||||
x-stainless-async:
|
||||
- 'false'
|
||||
x-stainless-lang:
|
||||
- python
|
||||
x-stainless-os:
|
||||
- MacOS
|
||||
x-stainless-package-version:
|
||||
- 1.35.10
|
||||
x-stainless-runtime:
|
||||
- CPython
|
||||
x-stainless-runtime-version:
|
||||
- 3.12.3
|
||||
method: POST
|
||||
uri: https://api.openai.com/v1/chat/completions
|
||||
response:
|
||||
body:
|
||||
string: 'data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"role":"assistant","content":""},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"Thought"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"
|
||||
I"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"
|
||||
now"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"
|
||||
can"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"
|
||||
give"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"
|
||||
a"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"
|
||||
great"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"
|
||||
answer"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"\n"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"Final"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"
|
||||
Answer"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":":"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"
|
||||
"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{"content":"4"},"logprobs":null,"finish_reason":null}]}
|
||||
|
||||
|
||||
data: {"id":"chatcmpl-9jCJjSE1CUTbcdPQgWhGnINQBfDJr","object":"chat.completion.chunk","created":1720559135,"model":"gpt-4o-2024-05-13","system_fingerprint":"fp_ce0793330f","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}]}
|
||||
|
||||
|
||||
data: [DONE]
|
||||
|
||||
|
||||
'
|
||||
headers:
|
||||
CF-Cache-Status:
|
||||
- DYNAMIC
|
||||
CF-RAY:
|
||||
- 8a0b45e24b19bd4d-ATL
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Type:
|
||||
- text/event-stream; charset=utf-8
|
||||
Date:
|
||||
- Tue, 09 Jul 2024 21:05:35 GMT
|
||||
Server:
|
||||
- cloudflare
|
||||
Set-Cookie:
|
||||
- __cf_bm=N7yNe.ilaHt2MJPusthFVyL5PrE._f_nyf4RfU.oIv0-1720559135-1.0.1.1-oCOj_tvpNYp16zBvNbxW.TwSHAFXRiB_i23X4XBw_o01D1_7OKj_HwRNZWdwg9DjDh_C_FSMKTonmzQmsUmtdg;
|
||||
path=/; expires=Tue, 09-Jul-24 21:35:35 GMT; domain=.api.openai.com; HttpOnly;
|
||||
Secure; SameSite=None
|
||||
- _cfuvid=aiUOV0PnMjHles7YFoHcFY7PK2Ag6MdKr0GWZzZ_rZo-1720559135403-0.0.1.1-604800000;
|
||||
path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
|
||||
Transfer-Encoding:
|
||||
- chunked
|
||||
alt-svc:
|
||||
- h3=":443"; ma=86400
|
||||
openai-organization:
|
||||
- crewai-iuxna1
|
||||
openai-processing-ms:
|
||||
- '105'
|
||||
openai-version:
|
||||
- '2020-10-01'
|
||||
strict-transport-security:
|
||||
- max-age=31536000; includeSubDomains
|
||||
x-ratelimit-limit-requests:
|
||||
- '10000'
|
||||
x-ratelimit-limit-tokens:
|
||||
- '22000000'
|
||||
x-ratelimit-remaining-requests:
|
||||
- '9999'
|
||||
x-ratelimit-remaining-tokens:
|
||||
- '21999771'
|
||||
x-ratelimit-reset-requests:
|
||||
- 6ms
|
||||
x-ratelimit-reset-tokens:
|
||||
- 0s
|
||||
x-request-id:
|
||||
- req_759b74b995b84a531eae7df3eddf1196
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
- request:
|
||||
body: '{"messages": [{"role": "user", "content": "4"}, {"role": "system", "content":
|
||||
"I''m gonna convert this raw text into valid JSON."}], "model": "gpt-4o", "tool_choice":
|
||||
{"type": "function", "function": {"name": "ScoreOutput"}}, "tools": [{"type":
|
||||
"function", "function": {"name": "ScoreOutput", "description": "Correctly extracted
|
||||
`ScoreOutput` with all the required parameters with correct types", "parameters":
|
||||
{"properties": {"score": {"title": "Score", "type": "integer"}}, "required":
|
||||
["score"], "type": "object"}}}]}'
|
||||
headers:
|
||||
accept:
|
||||
- application/json
|
||||
accept-encoding:
|
||||
- gzip, deflate
|
||||
connection:
|
||||
- keep-alive
|
||||
content-length:
|
||||
- '519'
|
||||
content-type:
|
||||
- application/json
|
||||
cookie:
|
||||
- __cf_bm=N7yNe.ilaHt2MJPusthFVyL5PrE._f_nyf4RfU.oIv0-1720559135-1.0.1.1-oCOj_tvpNYp16zBvNbxW.TwSHAFXRiB_i23X4XBw_o01D1_7OKj_HwRNZWdwg9DjDh_C_FSMKTonmzQmsUmtdg;
|
||||
_cfuvid=aiUOV0PnMjHles7YFoHcFY7PK2Ag6MdKr0GWZzZ_rZo-1720559135403-0.0.1.1-604800000
|
||||
host:
|
||||
- api.openai.com
|
||||
user-agent:
|
||||
- OpenAI/Python 1.35.10
|
||||
x-stainless-arch:
|
||||
- arm64
|
||||
x-stainless-async:
|
||||
- 'false'
|
||||
x-stainless-lang:
|
||||
- python
|
||||
x-stainless-os:
|
||||
- MacOS
|
||||
x-stainless-package-version:
|
||||
- 1.35.10
|
||||
x-stainless-runtime:
|
||||
- CPython
|
||||
x-stainless-runtime-version:
|
||||
- 3.12.3
|
||||
method: POST
|
||||
uri: https://api.openai.com/v1/chat/completions
|
||||
response:
|
||||
body:
|
||||
string: !!binary |
|
||||
H4sIAAAAAAAAA2xS22rcMBB991eIeV4XX9ZJ1m8lEGgKSZtSUnLBKPLYq40sCWmcdFn234u8ztpZ
|
||||
6gcxzJlzYca7iDGQNZQMxJqT6KyKV5vL680mzX58Xd4l773D7O63vMjP7rfrKwuLwDAvGxT0wfoi
|
||||
TGcVkjT6AAuHnDCopudZUhSrNC8GoDM1qkBrLcVLE2dJtoyTIk7zkbg2UqCHkj1GjDG2G94QUdf4
|
||||
F0qWLD46HXrPW4TyOMQYOKNCB7j30hPXBIsJFEYT6pBa90rNADJGVYIrNRkfvt2snvbElareb27S
|
||||
b28/v7/VRXtP13X75+GMF+hmfgfprR0CNb0Wx/3M8GO/PDFjDDTvBu4vYRze9mR7OqEzBty1fYea
|
||||
QnTYPYEPw09QLvfwaXQf/a9+Hqv9ca3KtNaZF3+yJWikln5dOeR+SAuejD1YBLnn4Xz9p4uAdaaz
|
||||
VJF5RR0EL8brwfS/TGAxYmSIqxmniMZ44LeesKsaqVt01snhlNDYSmByvsrzPGkg2kf/AAAA//8D
|
||||
AKtPZkLTAgAA
|
||||
headers:
|
||||
CF-Cache-Status:
|
||||
- DYNAMIC
|
||||
CF-RAY:
|
||||
- 8a0b45e5ffd7bd4d-ATL
|
||||
Connection:
|
||||
- keep-alive
|
||||
Content-Encoding:
|
||||
- gzip
|
||||
Content-Type:
|
||||
- application/json
|
||||
Date:
|
||||
- Tue, 09 Jul 2024 21:05:36 GMT
|
||||
Server:
|
||||
- cloudflare
|
||||
Transfer-Encoding:
|
||||
- chunked
|
||||
alt-svc:
|
||||
- h3=":443"; ma=86400
|
||||
openai-organization:
|
||||
- crewai-iuxna1
|
||||
openai-processing-ms:
|
||||
- '153'
|
||||
openai-version:
|
||||
- '2020-10-01'
|
||||
strict-transport-security:
|
||||
- max-age=31536000; includeSubDomains
|
||||
x-ratelimit-limit-requests:
|
||||
- '10000'
|
||||
x-ratelimit-limit-tokens:
|
||||
- '22000000'
|
||||
x-ratelimit-remaining-requests:
|
||||
- '9999'
|
||||
x-ratelimit-remaining-tokens:
|
||||
- '21999969'
|
||||
x-ratelimit-reset-requests:
|
||||
- 6ms
|
||||
x-ratelimit-reset-tokens:
|
||||
- 0s
|
||||
x-request-id:
|
||||
- req_36cd16b74a2085c72139d09309d21e39
|
||||
status:
|
||||
code: 200
|
||||
message: OK
|
||||
version: 1
|
||||
@@ -87,6 +87,86 @@ def test_crew_config_conditional_requirement():
|
||||
]
|
||||
|
||||
|
||||
def test_async_task_cannot_include_sequential_async_tasks_in_context():
|
||||
task1 = Task(
|
||||
description="Task 1",
|
||||
async_execution=True,
|
||||
expected_output="output",
|
||||
agent=researcher,
|
||||
)
|
||||
task2 = Task(
|
||||
description="Task 2",
|
||||
async_execution=True,
|
||||
expected_output="output",
|
||||
agent=researcher,
|
||||
context=[task1],
|
||||
)
|
||||
task3 = Task(
|
||||
description="Task 3",
|
||||
async_execution=True,
|
||||
expected_output="output",
|
||||
agent=researcher,
|
||||
context=[task2],
|
||||
)
|
||||
task4 = Task(
|
||||
description="Task 4",
|
||||
expected_output="output",
|
||||
agent=writer,
|
||||
)
|
||||
task5 = Task(
|
||||
description="Task 5",
|
||||
async_execution=True,
|
||||
expected_output="output",
|
||||
agent=researcher,
|
||||
context=[task4],
|
||||
)
|
||||
|
||||
# This should raise an error because task2 is async and has task1 in its context without a sync task in between
|
||||
with pytest.raises(
|
||||
ValueError,
|
||||
match="Task 'Task 2' is asynchronous and cannot include other sequential asynchronous tasks in its context.",
|
||||
):
|
||||
Crew(tasks=[task1, task2, task3, task4, task5], agents=[researcher, writer])
|
||||
|
||||
# This should not raise an error because task5 has a sync task (task4) in its context
|
||||
try:
|
||||
Crew(tasks=[task1, task4, task5], agents=[researcher, writer])
|
||||
except ValueError:
|
||||
pytest.fail("Unexpected ValidationError raised")
|
||||
|
||||
|
||||
def test_context_no_future_tasks():
|
||||
task2 = Task(
|
||||
description="Task 2",
|
||||
expected_output="output",
|
||||
agent=researcher,
|
||||
)
|
||||
task3 = Task(
|
||||
description="Task 3",
|
||||
expected_output="output",
|
||||
agent=researcher,
|
||||
context=[task2],
|
||||
)
|
||||
task4 = Task(
|
||||
description="Task 4",
|
||||
expected_output="output",
|
||||
agent=researcher,
|
||||
)
|
||||
task1 = Task(
|
||||
description="Task 1",
|
||||
expected_output="output",
|
||||
agent=researcher,
|
||||
context=[task4],
|
||||
)
|
||||
|
||||
# This should raise an error because task1 has a context dependency on a future task (task4)
|
||||
with pytest.raises(
|
||||
ValueError,
|
||||
match="Task 'Task 1' has a context dependency on a future task 'Task 4', which is not allowed.",
|
||||
):
|
||||
Crew(tasks=[task1, task2, task3, task4], agents=[researcher, writer])
|
||||
|
||||
|
||||
def test_crew_config_with_wrong_keys():
|
||||
no_tasks_config = json.dumps(
|
||||
{
|
||||
@@ -144,10 +224,10 @@ def test_crew_creation():
|
||||
expected_string_output = "1. **The Rise of AI in Healthcare**: The convergence of AI and healthcare is a promising frontier, offering unprecedented opportunities for disease diagnosis and patient outcome prediction. AI's potential to revolutionize healthcare lies in its capacity to synthesize vast amounts of data, generating precise and efficient results. This technological breakthrough, however, is not just about improving accuracy and efficiency; it's about saving lives. As we stand on the precipice of this transformative era, we must prepare for the complex challenges and ethical questions it poses, while embracing its ability to reshape healthcare as we know it.\n\n2. **Ethical Implications of AI**: As AI intertwines with our daily lives, it presents a complex web of ethical dilemmas. This fusion of technology, philosophy, and ethics is not merely academically intriguing but profoundly impacts the fabric of our society. The questions raised range from decision-making transparency to accountability, and from privacy to potential biases. As we navigate this ethical labyrinth, it is crucial to establish robust frameworks and regulations to ensure that AI serves humanity, and not the other way around.\n\n3. **AI and Data Privacy**: The rise of AI brings with it an insatiable appetite for data, spawning new debates around privacy rights. Balancing the potential benefits of AI with the right to privacy is a unique challenge that intersects technology, law, and human rights. In an increasingly digital world, where personal information forms the backbone of many services, we must grapple with these issues. It's time to redefine the concept of privacy and devise innovative solutions that ensure our digital footprints are not abused.\n\n4. **AI in Job Market**: The discourse around AI's impact on employment is a narrative of contrast, a tale of displacement and creation. On one hand, AI threatens to automate a multitude of jobs, on the other, it promises to create new roles that we cannot yet imagine. This intersection of technology, economics, and labor rights is a critical dialogue that will shape our future. As we stand at this crossroads, we must not only brace ourselves for the changes but also seize the opportunities that this technological wave brings.\n\n5. **Future of AI Agents**: The evolution of AI agents signifies a leap towards a future where AI is not just a tool, but a partner. These sophisticated AI agents, employed in customer service to personal assistants, are redefining our interactions with technology. As we gaze into the future of AI agents, we see a landscape of possibilities and challenges. This journey will be about harnessing the potential of AI agents while navigating the issues of trust, dependence, and ethical use."
|
||||
|
||||
assert str(result) == expected_string_output
|
||||
assert result.raw_output() == expected_string_output
|
||||
assert result.raw == expected_string_output
|
||||
assert isinstance(result, CrewOutput)
|
||||
assert len(result.tasks_output) == len(tasks)
|
||||
assert result.result() == [expected_string_output]
|
||||
assert result.raw == expected_string_output
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
@@ -174,7 +254,7 @@ def test_sync_task_execution():
|
||||
)
|
||||
|
||||
mock_task_output = TaskOutput(
|
||||
description="Mock description", raw_output="mocked output", agent="mocked agent"
|
||||
description="Mock description", raw="mocked output", agent="mocked agent"
|
||||
)
|
||||
|
||||
# Because we are mocking execute_sync, we never hit the underlying _execute_core
|
||||
@@ -210,7 +290,7 @@ def test_hierarchical_process():
|
||||
result = crew.kickoff()
|
||||
|
||||
assert (
|
||||
result.raw_output()
|
||||
result.raw
|
||||
== "1. 'Demystifying AI: An in-depth exploration of Artificial Intelligence for the layperson' - In this piece, we will unravel the enigma of AI, simplifying its complexities into digestible information for the everyday individual. By using relatable examples and analogies, we will journey through the neural networks and machine learning algorithms that define AI, without the jargon and convoluted explanations that often accompany such topics.\n\n2. 'The Role of AI in Startups: A Game Changer?' - Startups today are harnessing the power of AI to revolutionize their businesses. This article will delve into how AI, as an innovative force, is shaping the startup ecosystem, transforming everything from customer service to product development. We'll explore real-life case studies of startups that have leveraged AI to accelerate their growth and disrupt their respective industries.\n\n3. 'AI and Ethics: Navigating the Complex Landscape' - AI brings with it not just technological advancements, but ethical dilemmas as well. This article will engage readers in a thought-provoking discussion on the ethical implications of AI, exploring issues like bias in algorithms, privacy concerns, job displacement, and the moral responsibility of AI developers. We will also discuss potential solutions and frameworks to address these challenges.\n\n4. 'Unveiling the AI Agents: The Future of Customer Service' - AI agents are poised to reshape the customer service landscape, offering businesses the ability to provide round-the-clock support and personalized experiences. In this article, we'll dive deep into the world of AI agents, examining how they work, their benefits and limitations, and how they're set to redefine customer interactions in the digital age.\n\n5. 'From Science Fiction to Reality: AI in Everyday Life' - AI, once a concept limited to the realm of sci-fi, has now permeated our daily lives. This article will highlight the ubiquitous presence of AI, from voice assistants and recommendation algorithms, to autonomous vehicles and smart homes. We'll explore how AI, in its various forms, is transforming our everyday experiences, making the future seem a lot closer than we imagined."
|
||||
)
|
||||
|
||||
@@ -248,7 +328,7 @@ def test_crew_with_delegating_agents():
|
||||
result = crew.kickoff()
|
||||
|
||||
assert (
|
||||
result.raw_output()
|
||||
result.raw
|
||||
== "AI Agents, simply put, are intelligent systems that can perceive their environment and take actions to reach specific goals. Imagine them as digital assistants that can learn, adapt and make decisions. They operate in the realms of software or hardware, like a chatbot on a website or a self-driving car. The key to their intelligence is their ability to learn from their experiences, making them better at their tasks over time. In today's interconnected world, AI agents are transforming our lives. They enhance customer service experiences, streamline business processes, and even predict trends in data. Vehicles equipped with AI agents are making transportation safer. In healthcare, AI agents are helping to diagnose diseases, personalizing treatment plans, and monitoring patient health. As we embrace the digital era, these AI agents are not just important, they're becoming indispensable, shaping a future where technology works intuitively and intelligently to meet our needs."
|
||||
)
|
||||
|
||||
@@ -413,7 +493,7 @@ def test_api_calls_throttling(capsys):
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_crew_kickoff_for_each_full_ouput():
|
||||
def test_crew_kickoff_usage_metrics():
|
||||
inputs = [
|
||||
{"topic": "dog"},
|
||||
{"topic": "cat"},
|
||||
@@ -432,14 +512,11 @@ def test_crew_kickoff_for_each_full_ouput():
|
||||
agent=agent,
|
||||
)
|
||||
|
||||
crew = Crew(agents=[agent], tasks=[task], full_output=True)
|
||||
crew = Crew(agents=[agent], tasks=[task])
|
||||
results = crew.kickoff_for_each(inputs=inputs)
|
||||
|
||||
assert len(results) == len(inputs)
|
||||
for result in results:
|
||||
assert "usage_metrics" in result
|
||||
assert isinstance(result["usage_metrics"], dict)
|
||||
|
||||
# Assert that all required keys are in usage_metrics and their values are not None
|
||||
for key in [
|
||||
"total_tokens",
|
||||
@@ -447,8 +524,8 @@ def test_crew_kickoff_for_each_full_ouput():
|
||||
"completion_tokens",
|
||||
"successful_requests",
|
||||
]:
|
||||
assert key in result["usage_metrics"]
|
||||
assert result["usage_metrics"][key] > 0
|
||||
assert key in result.token_usage
|
||||
assert result.token_usage[key] > 0
|
||||
|
||||
|
||||
def test_agents_rpm_is_never_set_if_crew_max_RPM_is_not_set():
|
||||
@@ -471,22 +548,6 @@ def test_agents_rpm_is_never_set_if_crew_max_RPM_is_not_set():
|
||||
assert agent._rpm_controller is None
|
||||
|
||||
|
||||
"""
|
||||
Future tests:
|
||||
TODO: 1 async task, 1 sync task. Make sure sync task waits for async to finish before starting.[]
|
||||
TODO: 3 async tasks, 1 sync task. Make sure sync task waits for async to finish before starting.
|
||||
TODO: 1 sync task, 1 async task. Make sure we wait for result from async before finishing crew.
|
||||
|
||||
TODO: 3 async tasks, 1 sync task. Make sure context from all 3 async tasks is passed to sync task.
|
||||
TODO: 3 async tasks, 1 sync task. Pass in context from only 1 async task to sync task.
|
||||
|
||||
TODO: Test pydantic output of CrewOutput and test type in CrewOutput result
|
||||
TODO: Test json output of CrewOutput and test type in CrewOutput result
|
||||
|
||||
TODO: TEST THE SAME THING BUT WITH HIERARCHICAL PROCESS
|
||||
"""
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_sequential_async_task_execution_completion():
|
||||
list_ideas = Task(
|
||||
@@ -515,48 +576,11 @@ def test_sequential_async_task_execution_completion():
|
||||
)
|
||||
|
||||
sequential_result = sequential_crew.kickoff()
|
||||
assert sequential_result.raw_output().startswith(
|
||||
assert sequential_result.raw.startswith(
|
||||
"**The Evolution of Artificial Intelligence: A Journey Through Milestones**"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_hierarchical_async_task_execution_completion():
|
||||
from langchain_openai import ChatOpenAI
|
||||
|
||||
list_ideas = Task(
|
||||
description="Give me a list of 5 interesting ideas to explore for na article, what makes them unique and interesting.",
|
||||
expected_output="Bullet point list of 5 important events.",
|
||||
agent=researcher,
|
||||
async_execution=True,
|
||||
)
|
||||
list_important_history = Task(
|
||||
description="Research the history of AI and give me the 5 most important events that shaped the technology.",
|
||||
expected_output="Bullet point list of 5 important events.",
|
||||
agent=researcher,
|
||||
async_execution=True,
|
||||
)
|
||||
write_article = Task(
|
||||
description="Write an article about the history of AI and its most important events.",
|
||||
expected_output="A 4 paragraph article about AI.",
|
||||
agent=writer,
|
||||
context=[list_ideas, list_important_history],
|
||||
)
|
||||
|
||||
hierarchical_crew = Crew(
|
||||
agents=[researcher, writer],
|
||||
process=Process.hierarchical,
|
||||
tasks=[list_ideas, list_important_history, write_article],
|
||||
manager_llm=ChatOpenAI(temperature=0, model="gpt-4"),
|
||||
)
|
||||
|
||||
hierarchical_result = hierarchical_crew.kickoff()
|
||||
|
||||
assert hierarchical_result.raw_output().startswith(
|
||||
"The history of artificial intelligence (AI) is a fascinating journey"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_single_task_with_async_execution():
|
||||
researcher_agent = Agent(
|
||||
@@ -580,8 +604,7 @@ def test_single_task_with_async_execution():
|
||||
)
|
||||
|
||||
result = crew.kickoff()
|
||||
print(result.raw_output())
|
||||
assert result.raw_output().startswith(
|
||||
assert result.raw.startswith(
|
||||
"- The impact of AI agents on remote work productivity."
|
||||
)
|
||||
|
||||
@@ -614,17 +637,21 @@ def test_three_task_with_async_execution():
|
||||
async_execution=True,
|
||||
)
|
||||
|
||||
crew = Crew(
|
||||
agents=[researcher_agent],
|
||||
process=Process.sequential,
|
||||
tasks=[bullet_list, numbered_list, letter_list],
|
||||
)
|
||||
# Expected result is that we will get an error
|
||||
# because a crew can end only end with one or less
|
||||
# async tasks
|
||||
with pytest.raises(pydantic_core._pydantic_core.ValidationError) as error:
|
||||
Crew(
|
||||
agents=[researcher_agent],
|
||||
process=Process.sequential,
|
||||
tasks=[bullet_list, numbered_list, letter_list],
|
||||
)
|
||||
|
||||
# Expected result is that we are going to concatenate the output from each async task.
|
||||
# Because we add a buffer between each task, we should see a "----------" string
|
||||
# after the first and second task in the final output.
|
||||
result = crew.kickoff()
|
||||
assert result.raw_output().count("\n\n----------\n\n") == 2
|
||||
assert error.value.errors()[0]["type"] == "async_task_count"
|
||||
assert (
|
||||
"The crew must end with at most one asynchronous task."
|
||||
in error.value.errors()[0]["msg"]
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
@@ -648,7 +675,7 @@ async def test_crew_async_kickoff():
|
||||
agent=agent,
|
||||
)
|
||||
|
||||
crew = Crew(agents=[agent], tasks=[task], full_output=True)
|
||||
crew = Crew(agents=[agent], tasks=[task])
|
||||
results = await crew.kickoff_for_each_async(inputs=inputs)
|
||||
|
||||
assert len(results) == len(inputs)
|
||||
@@ -661,8 +688,7 @@ async def test_crew_async_kickoff():
|
||||
"successful_requests",
|
||||
]:
|
||||
assert key in result.token_usage
|
||||
# TODO: FIX THIS WHEN USAGE METRICS ARE RE-DONE
|
||||
# assert result.token_usage[key] > 0
|
||||
assert result.token_usage[key] > 0
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
@@ -695,7 +721,7 @@ def test_async_task_execution_call_count():
|
||||
|
||||
# Create a valid TaskOutput instance to mock the return value
|
||||
mock_task_output = TaskOutput(
|
||||
description="Mock description", raw_output="mocked output", agent="mocked agent"
|
||||
description="Mock description", raw="mocked output", agent="mocked agent"
|
||||
)
|
||||
|
||||
# Create a MagicMock Future instance
|
||||
@@ -721,10 +747,8 @@ def test_async_task_execution_call_count():
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_kickoff_for_each_single_input():
|
||||
"""Tests if kickoff_for_each works with a single input."""
|
||||
from unittest.mock import patch
|
||||
|
||||
inputs = [{"topic": "dog"}]
|
||||
expected_outputs = ["Dogs are loyal companions and popular pets."]
|
||||
|
||||
agent = Agent(
|
||||
role="{topic} Researcher",
|
||||
@@ -738,32 +762,21 @@ def test_kickoff_for_each_single_input():
|
||||
agent=agent,
|
||||
)
|
||||
|
||||
with patch.object(Agent, "execute_task") as mock_execute_task:
|
||||
mock_execute_task.side_effect = expected_outputs
|
||||
crew = Crew(agents=[agent], tasks=[task])
|
||||
results = crew.kickoff_for_each(inputs=inputs)
|
||||
crew = Crew(agents=[agent], tasks=[task])
|
||||
results = crew.kickoff_for_each(inputs=inputs)
|
||||
|
||||
assert len(results) == 1
|
||||
print("RESULT:", results)
|
||||
for result in results:
|
||||
assert result == expected_outputs[0]
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_kickoff_for_each_multiple_inputs():
|
||||
"""Tests if kickoff_for_each works with multiple inputs."""
|
||||
from unittest.mock import patch
|
||||
|
||||
inputs = [
|
||||
{"topic": "dog"},
|
||||
{"topic": "cat"},
|
||||
{"topic": "apple"},
|
||||
]
|
||||
expected_outputs = [
|
||||
"Dogs are loyal companions and popular pets.",
|
||||
"Cats are independent and low-maintenance pets.",
|
||||
"Apples are a rich source of dietary fiber and vitamin C.",
|
||||
]
|
||||
|
||||
agent = Agent(
|
||||
role="{topic} Researcher",
|
||||
@@ -777,14 +790,10 @@ def test_kickoff_for_each_multiple_inputs():
|
||||
agent=agent,
|
||||
)
|
||||
|
||||
with patch.object(Agent, "execute_task") as mock_execute_task:
|
||||
mock_execute_task.side_effect = expected_outputs
|
||||
crew = Crew(agents=[agent], tasks=[task])
|
||||
results = crew.kickoff_for_each(inputs=inputs)
|
||||
crew = Crew(agents=[agent], tasks=[task])
|
||||
results = crew.kickoff_for_each(inputs=inputs)
|
||||
|
||||
assert len(results) == len(inputs)
|
||||
for i, res in enumerate(results):
|
||||
assert res == expected_outputs[i]
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
@@ -1056,7 +1065,7 @@ def test_crew_function_calling_llm():
|
||||
with patch.object(llm.client, "create", wraps=llm.client.create) as private_mock:
|
||||
|
||||
@tool
|
||||
def learn_about_AI(topic) -> float:
|
||||
def learn_about_AI(topic) -> str:
|
||||
"""Useful for when you need to learn about AI to write an paragraph about it."""
|
||||
return "AI is a very broad field."
|
||||
|
||||
@@ -1105,7 +1114,7 @@ def test_task_with_no_arguments():
|
||||
crew = Crew(agents=[researcher], tasks=[task])
|
||||
|
||||
result = crew.kickoff()
|
||||
assert result.raw_output() == "75"
|
||||
assert result.raw == "75"
|
||||
|
||||
|
||||
def test_code_execution_flag_adds_code_tool_upon_kickoff():
|
||||
@@ -1170,39 +1179,12 @@ def test_agents_do_not_get_delegation_tools_with_there_is_only_one_agent():
|
||||
|
||||
result = crew.kickoff()
|
||||
assert (
|
||||
result.raw_output()
|
||||
result.raw
|
||||
== "Howdy! I hope this message finds you well and brings a smile to your face. Have a fantastic day!"
|
||||
)
|
||||
assert len(agent.tools) == 0
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_agent_usage_metrics_are_captured_for_sequential_process():
|
||||
agent = Agent(
|
||||
role="Researcher",
|
||||
goal="Be super empathetic.",
|
||||
backstory="You're love to sey howdy.",
|
||||
allow_delegation=False,
|
||||
)
|
||||
|
||||
task = Task(description="say howdy", expected_output="Howdy!", agent=agent)
|
||||
|
||||
crew = Crew(agents=[agent], tasks=[task])
|
||||
|
||||
result = crew.kickoff()
|
||||
assert result.raw_output() == "Howdy!"
|
||||
|
||||
required_keys = [
|
||||
"total_tokens",
|
||||
"prompt_tokens",
|
||||
"completion_tokens",
|
||||
"successful_requests",
|
||||
]
|
||||
for key in required_keys:
|
||||
assert key in crew.usage_metrics, f"Key '{key}' not found in usage_metrics"
|
||||
assert crew.usage_metrics[key] > 0, f"Value for key '{key}' is zero"
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_sequential_crew_creation_tasks_without_agents():
|
||||
task = Task(
|
||||
@@ -1247,13 +1229,15 @@ def test_agent_usage_metrics_are_captured_for_hierarchical_process():
|
||||
)
|
||||
|
||||
result = crew.kickoff()
|
||||
assert result.raw_output() == '"Howdy!"'
|
||||
assert result.raw == '"Howdy!"'
|
||||
|
||||
print(crew.usage_metrics)
|
||||
|
||||
assert crew.usage_metrics == {
|
||||
"total_tokens": 1927,
|
||||
"prompt_tokens": 1557,
|
||||
"completion_tokens": 370,
|
||||
"successful_requests": 4,
|
||||
"total_tokens": 311,
|
||||
"prompt_tokens": 224,
|
||||
"completion_tokens": 87,
|
||||
"successful_requests": 1,
|
||||
}
|
||||
|
||||
|
||||
@@ -1278,15 +1262,17 @@ def test_hierarchical_crew_creation_tasks_with_agents():
|
||||
manager_llm=ChatOpenAI(model="gpt-4o"),
|
||||
)
|
||||
crew.kickoff()
|
||||
|
||||
assert crew.manager_agent is not None
|
||||
assert crew.manager_agent.tools is not None
|
||||
print("TOOL DESCRIPTION", crew.manager_agent.tools[0].description)
|
||||
assert crew.manager_agent.tools[0].description.startswith(
|
||||
"Delegate a specific task to one of the following coworkers: [Senior Writer]"
|
||||
"Delegate a specific task to one of the following coworkers: [Senior Writer, Researcher]"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_hierarchical_crew_creation_tasks_without_async_execution():
|
||||
def test_hierarchical_crew_creation_tasks_with_async_execution():
|
||||
from langchain_openai import ChatOpenAI
|
||||
|
||||
task = Task(
|
||||
@@ -1481,7 +1467,7 @@ def test_tools_with_custom_caching():
|
||||
from crewai_tools import tool
|
||||
|
||||
@tool
|
||||
def multiplcation_tool(first_number: int, second_number: int) -> str:
|
||||
def multiplcation_tool(first_number: int, second_number: int) -> int:
|
||||
"""Useful for when you need to multiply two numbers together."""
|
||||
return first_number * second_number
|
||||
|
||||
@@ -1543,7 +1529,7 @@ def test_tools_with_custom_caching():
|
||||
input={"first_number": 2, "second_number": 6},
|
||||
output=12,
|
||||
)
|
||||
assert result.raw_output() == "3"
|
||||
assert result.raw == "3"
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
@@ -1642,7 +1628,7 @@ def test_manager_agent():
|
||||
)
|
||||
|
||||
mock_task_output = TaskOutput(
|
||||
description="Mock description", raw_output="mocked output", agent="mocked agent"
|
||||
description="Mock description", raw="mocked output", agent="mocked agent"
|
||||
)
|
||||
|
||||
# Because we are mocking execute_sync, we never hit the underlying _execute_core
|
||||
@@ -1818,11 +1804,6 @@ def test__setup_for_training():
|
||||
assert agent.allow_delegation is False
|
||||
|
||||
|
||||
# TODO: TEST EXPORT OUTPUT TASK WITH PYDANTIC
|
||||
# TODO: TEST EXPORT OUTPUT TASK WITH JSON
|
||||
# TODO: TEST EXPORT OUTPUT TASK CALLBACK
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_replay_feature():
|
||||
list_ideas = Task(
|
||||
|
||||
@@ -109,6 +109,8 @@ def test_task_callback():
|
||||
|
||||
|
||||
def test_task_callback_returns_task_ouput():
|
||||
from crewai.tasks.output_format import OutputFormat
|
||||
|
||||
researcher = Agent(
|
||||
role="Researcher",
|
||||
goal="Make the best research and analysis on content about AI and AI agents",
|
||||
@@ -140,10 +142,12 @@ def test_task_callback_returns_task_ouput():
|
||||
output_dict = json.loads(callback_data)
|
||||
expected_output = {
|
||||
"description": task.description,
|
||||
"exported_output": "exported_ok",
|
||||
"raw_output": "exported_ok",
|
||||
"raw": "exported_ok",
|
||||
"pydantic": None,
|
||||
"json_dict": None,
|
||||
"agent": researcher.role,
|
||||
"summary": "Give me a list of 5 interesting ideas to explore...",
|
||||
"output_format": OutputFormat.RAW,
|
||||
}
|
||||
assert output_dict == expected_output
|
||||
|
||||
@@ -200,7 +204,7 @@ def test_multiple_output_type_error():
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_output_pydantic():
|
||||
def test_output_pydantic_sequential():
|
||||
class ScoreOutput(BaseModel):
|
||||
score: int
|
||||
|
||||
@@ -218,13 +222,46 @@ def test_output_pydantic():
|
||||
agent=scorer,
|
||||
)
|
||||
|
||||
crew = Crew(agents=[scorer], tasks=[task])
|
||||
crew = Crew(agents=[scorer], tasks=[task], process=Process.sequential)
|
||||
result = crew.kickoff()
|
||||
assert isinstance(result, ScoreOutput)
|
||||
assert isinstance(result.pydantic, ScoreOutput)
|
||||
assert result.to_dict() == {"score": 4}
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_output_json():
|
||||
def test_output_pydantic_hierarchical():
|
||||
from langchain_openai import ChatOpenAI
|
||||
|
||||
class ScoreOutput(BaseModel):
|
||||
score: int
|
||||
|
||||
scorer = Agent(
|
||||
role="Scorer",
|
||||
goal="Score the title",
|
||||
backstory="You're an expert scorer, specialized in scoring titles.",
|
||||
allow_delegation=False,
|
||||
)
|
||||
|
||||
task = Task(
|
||||
description="Give me an integer score between 1-5 for the following title: 'The impact of AI in the future of work'",
|
||||
expected_output="The score of the title.",
|
||||
output_pydantic=ScoreOutput,
|
||||
agent=scorer,
|
||||
)
|
||||
|
||||
crew = Crew(
|
||||
agents=[scorer],
|
||||
tasks=[task],
|
||||
process=Process.hierarchical,
|
||||
manager_llm=ChatOpenAI(model="gpt-4o"),
|
||||
)
|
||||
result = crew.kickoff()
|
||||
assert isinstance(result.pydantic, ScoreOutput)
|
||||
assert result.to_dict() == {"score": 4}
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_output_json_sequential():
|
||||
class ScoreOutput(BaseModel):
|
||||
score: int
|
||||
|
||||
@@ -242,9 +279,126 @@ def test_output_json():
|
||||
agent=scorer,
|
||||
)
|
||||
|
||||
crew = Crew(agents=[scorer], tasks=[task])
|
||||
crew = Crew(agents=[scorer], tasks=[task], process=Process.sequential)
|
||||
result = crew.kickoff()
|
||||
assert '{\n "score": 4\n}' == result
|
||||
assert '{"score": 4}' == result.json
|
||||
assert result.to_dict() == {"score": 4}
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_output_json_hierarchical():
|
||||
from langchain_openai import ChatOpenAI
|
||||
|
||||
class ScoreOutput(BaseModel):
|
||||
score: int
|
||||
|
||||
scorer = Agent(
|
||||
role="Scorer",
|
||||
goal="Score the title",
|
||||
backstory="You're an expert scorer, specialized in scoring titles.",
|
||||
allow_delegation=False,
|
||||
)
|
||||
|
||||
task = Task(
|
||||
description="Give me an integer score between 1-5 for the following title: 'The impact of AI in the future of work'",
|
||||
expected_output="The score of the title.",
|
||||
output_json=ScoreOutput,
|
||||
agent=scorer,
|
||||
)
|
||||
|
||||
crew = Crew(
|
||||
agents=[scorer],
|
||||
tasks=[task],
|
||||
process=Process.hierarchical,
|
||||
manager_llm=ChatOpenAI(model="gpt-4o"),
|
||||
)
|
||||
result = crew.kickoff()
|
||||
assert '{"score": 4}' == result.json
|
||||
assert result.to_dict() == {"score": 4}
|
||||
|
||||
|
||||
def test_json_property_without_output_json():
|
||||
class ScoreOutput(BaseModel):
|
||||
score: int
|
||||
|
||||
scorer = Agent(
|
||||
role="Scorer",
|
||||
goal="Score the title",
|
||||
backstory="You're an expert scorer, specialized in scoring titles.",
|
||||
allow_delegation=False,
|
||||
)
|
||||
|
||||
task = Task(
|
||||
description="Give me an integer score between 1-5 for the following title: 'The impact of AI in the future of work'",
|
||||
expected_output="The score of the title.",
|
||||
output_pydantic=ScoreOutput, # Using output_pydantic instead of output_json
|
||||
agent=scorer,
|
||||
)
|
||||
|
||||
crew = Crew(agents=[scorer], tasks=[task], process=Process.sequential)
|
||||
result = crew.kickoff()
|
||||
|
||||
with pytest.raises(ValueError) as excinfo:
|
||||
_ = result.json # Attempt to access the json property
|
||||
|
||||
assert "No JSON output found in the final task." in str(excinfo.value)
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_output_json_dict_sequential():
|
||||
class ScoreOutput(BaseModel):
|
||||
score: int
|
||||
|
||||
scorer = Agent(
|
||||
role="Scorer",
|
||||
goal="Score the title",
|
||||
backstory="You're an expert scorer, specialized in scoring titles.",
|
||||
allow_delegation=False,
|
||||
)
|
||||
|
||||
task = Task(
|
||||
description="Give me an integer score between 1-5 for the following title: 'The impact of AI in the future of work'",
|
||||
expected_output="The score of the title.",
|
||||
output_json=ScoreOutput,
|
||||
agent=scorer,
|
||||
)
|
||||
|
||||
crew = Crew(agents=[scorer], tasks=[task], process=Process.sequential)
|
||||
result = crew.kickoff()
|
||||
assert {"score": 4} == result.json_dict
|
||||
assert result.to_dict() == {"score": 4}
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
def test_output_json_dict_hierarchical():
|
||||
from langchain_openai import ChatOpenAI
|
||||
|
||||
class ScoreOutput(BaseModel):
|
||||
score: int
|
||||
|
||||
scorer = Agent(
|
||||
role="Scorer",
|
||||
goal="Score the title",
|
||||
backstory="You're an expert scorer, specialized in scoring titles.",
|
||||
allow_delegation=False,
|
||||
)
|
||||
|
||||
task = Task(
|
||||
description="Give me an integer score between 1-5 for the following title: 'The impact of AI in the future of work'",
|
||||
expected_output="The score of the title.",
|
||||
output_json=ScoreOutput,
|
||||
agent=scorer,
|
||||
)
|
||||
|
||||
crew = Crew(
|
||||
agents=[scorer],
|
||||
tasks=[task],
|
||||
process=Process.hierarchical,
|
||||
manager_llm=ChatOpenAI(model="gpt-4o"),
|
||||
)
|
||||
result = crew.kickoff()
|
||||
assert {"score": 4} == result.json_dict
|
||||
assert result.to_dict() == {"score": 4}
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
@@ -280,7 +434,11 @@ def test_output_pydantic_to_another_task():
|
||||
|
||||
crew = Crew(agents=[scorer], tasks=[task1, task2], verbose=2)
|
||||
result = crew.kickoff()
|
||||
assert 5 == result.score
|
||||
pydantic_result = result.pydantic
|
||||
assert isinstance(
|
||||
pydantic_result, ScoreOutput
|
||||
), "Expected pydantic result to be of type ScoreOutput"
|
||||
assert 5 == pydantic_result.score
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
@@ -311,7 +469,7 @@ def test_output_json_to_another_task():
|
||||
|
||||
crew = Crew(agents=[scorer], tasks=[task1, task2])
|
||||
result = crew.kickoff()
|
||||
assert '{\n "score": 5\n}' == result
|
||||
assert '{"score": 5}' == result.json
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
@@ -363,7 +521,9 @@ def test_save_task_json_output():
|
||||
with patch.object(Task, "_save_file") as save_file:
|
||||
save_file.return_value = None
|
||||
crew.kickoff()
|
||||
save_file.assert_called_once_with('{\n "score": 4\n}')
|
||||
save_file.assert_called_once_with(
|
||||
{"score": 4}
|
||||
) # TODO: @Joao, should this be a dict or a json string?
|
||||
|
||||
|
||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||
@@ -558,12 +718,78 @@ def test_interpolate_inputs():
|
||||
assert task.expected_output == "Bullet point list of 5 interesting ideas about ML."
|
||||
|
||||
|
||||
"""
|
||||
TODO: TEST SYNC
|
||||
- Verify return type
|
||||
"""
|
||||
def test_task_output_str_with_pydantic():
|
||||
from crewai.tasks.output_format import OutputFormat
|
||||
|
||||
"""
|
||||
TODO: TEST ASYNC
|
||||
- Verify return type
|
||||
"""
|
||||
class ScoreOutput(BaseModel):
|
||||
score: int
|
||||
|
||||
score_output = ScoreOutput(score=4)
|
||||
task_output = TaskOutput(
|
||||
description="Test task",
|
||||
agent="Test Agent",
|
||||
pydantic=score_output,
|
||||
output_format=OutputFormat.PYDANTIC,
|
||||
)
|
||||
|
||||
assert str(task_output) == str(score_output)
|
||||
|
||||
|
||||
def test_task_output_str_with_json_dict():
|
||||
from crewai.tasks.output_format import OutputFormat
|
||||
|
||||
json_dict = {"score": 4}
|
||||
task_output = TaskOutput(
|
||||
description="Test task",
|
||||
agent="Test Agent",
|
||||
json_dict=json_dict,
|
||||
output_format=OutputFormat.JSON,
|
||||
)
|
||||
|
||||
assert str(task_output) == str(json_dict)
|
||||
|
||||
|
||||
def test_task_output_str_with_raw():
|
||||
from crewai.tasks.output_format import OutputFormat
|
||||
|
||||
raw_output = "Raw task output"
|
||||
task_output = TaskOutput(
|
||||
description="Test task",
|
||||
agent="Test Agent",
|
||||
raw=raw_output,
|
||||
output_format=OutputFormat.RAW,
|
||||
)
|
||||
|
||||
assert str(task_output) == raw_output
|
||||
|
||||
|
||||
def test_task_output_str_with_pydantic_and_json_dict():
|
||||
from crewai.tasks.output_format import OutputFormat
|
||||
|
||||
class ScoreOutput(BaseModel):
|
||||
score: int
|
||||
|
||||
score_output = ScoreOutput(score=4)
|
||||
json_dict = {"score": 4}
|
||||
task_output = TaskOutput(
|
||||
description="Test task",
|
||||
agent="Test Agent",
|
||||
pydantic=score_output,
|
||||
json_dict=json_dict,
|
||||
output_format=OutputFormat.PYDANTIC,
|
||||
)
|
||||
|
||||
# When both pydantic and json_dict are present, pydantic should take precedence
|
||||
assert str(task_output) == str(score_output)
|
||||
|
||||
|
||||
def test_task_output_str_with_none():
|
||||
from crewai.tasks.output_format import OutputFormat
|
||||
|
||||
task_output = TaskOutput(
|
||||
description="Test task",
|
||||
agent="Test Agent",
|
||||
output_format=OutputFormat.RAW,
|
||||
)
|
||||
|
||||
assert str(task_output) == ""
|
||||
|
||||
Reference in New Issue
Block a user