diff --git a/scope3ai/lib.py b/scope3ai/lib.py index a3b284b..d0ff9f3 100644 --- a/scope3ai/lib.py +++ b/scope3ai/lib.py @@ -226,7 +226,7 @@ async def submit_impact( tracer._link_trace(ctx) if self.sync_mode: - await submit_impact(impact_row) + await submit_impact(impact_row, ctx=ctx) return ctx self._ensure_worker() diff --git a/tests/cassettes/test_tracer_context.yaml b/tests/cassettes/test_tracer_context.yaml new file mode 100644 index 0000000..91a7eb9 --- /dev/null +++ b/tests/cassettes/test_tracer_context.yaml @@ -0,0 +1,426 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate + connection: + - keep-alive + host: + - raw.githubusercontent.com + user-agent: + - python-httpx/0.28.1 + method: GET + uri: https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json + response: + body: + string: !!binary | + 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 + wR214P7hH3/4/++aheRbXgQA + headers: + Accept-Ranges: + - bytes + Access-Control-Allow-Origin: + - '*' + Cache-Control: + - max-age=300 + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '14268' + Content-Security-Policy: + - default-src 'none'; style-src 'unsafe-inline'; sandbox + Content-Type: + - text/plain; charset=utf-8 + Cross-Origin-Resource-Policy: + - cross-origin + Date: + - Tue, 31 Dec 2024 17:45:42 GMT + ETag: + - W/"8a539499ba1ea7ba011dc791293749378a704ea94a2ddf6a99434c0a6abc2ac6" + Expires: + - Tue, 31 Dec 2024 17:50:42 GMT + Source-Age: + - '285' + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Authorization,Accept-Encoding,Origin + Via: + - 1.1 varnish + X-Cache: + - HIT + X-Cache-Hits: + - '2' + X-Content-Type-Options: + - nosniff + X-Fastly-Request-ID: + - 707630555924883f1be8a28277d00eda7006a3e2 + X-Frame-Options: + - deny + X-GitHub-Request-Id: + - 77AC:10FFFB:A193BA:B54F85:677418A6 + X-Served-By: + - cache-pdk-kpdk1780033-PDK + X-Timer: + - S1735667143.790228,VS0,VE0 + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: '{"messages":[{"role":"user","content":"Hello World!"}],"model":"gpt-4"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + authorization: + - DUMMY + connection: + - keep-alive + content-length: + - '71' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.57.1 + x-stainless-arch: + - x64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - Linux + x-stainless-package-version: + - 1.57.1 + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.6 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//jFJNSwMxFLzvr3jm3ErX1gq9iGDRRfDgSRFZ0uR1G5vNi8lbtJT+d8n2 + Y1tU8JLDzJvJzEvWGYAwWkxAqIVkVXvbv1nKWfHydLf64PxhXNx+PRZD5y6K6fxZTUUvKWj2jor3 + qnNFtbfIhtyWVgElY3LNr4aX4/FVPhq1RE0abZJVnvuj/mCcD3eKBRmFUUzgNQMAWLdnyuY0fokJ + DHp7pMYYZYVichgCEIFsQoSM0USWjkWvIxU5RtfGvUdr6Qzu6ROUdFDAVgAraoBJy9X1sTDgvIky + BXaNtTt8c0hiqfKBZnHHH/C5cSYuyoAykku3RiYvWnaTAby1jZuTEsIHqj2XTEt0yTDfFRbdbn8h + mVjaDr/Y4ydupUaWxsajjQkl1QJ1p+zWKxtt6IjIjjr/DPOb97a3cdV/7DtCKfSMuvQBtVGnhbux + gOnn/TV22HEbWMRVZKzLuXEVBh9M+wfap9xk3wAAAP//AwDzrrHT+gIAAA== + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8fac15c15e8da65a-MIA + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 31 Dec 2024 17:45:44 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=ckIgA4toca.r_hYiGHjCY_YDYjL.EeRi20nqw3CdcZs-1735667144-1.0.1.1-5h9utTK2GAvn8cUw2Ylhq15jNUo0O4WYMXoy8g9FTuUP8ZFnJXRBA6JEYeXeftzc5Mo9wBdSRa6AQSLhID78pg; + path=/; expires=Tue, 31-Dec-24 18:15:44 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=HtZwbEj1VBo7Ljt.red1aIXQ6CZNbnfLWdrLYe_Ej4Q-1735667144379-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - user-sxsjo8cvghsvsqprrtasrxyq + openai-processing-ms: + - '367' + openai-version: + - '2020-10-01' + strict-transport-security: + - max-age=31536000; includeSubDomains; preload + x-ratelimit-limit-requests: + - '5000' + x-ratelimit-limit-tokens: + - '80000' + x-ratelimit-remaining-requests: + - '4999' + x-ratelimit-remaining-tokens: + - '79980' + x-ratelimit-reset-requests: + - 12ms + x-ratelimit-reset-tokens: + - 15ms + x-request-id: + - req_371f1774bc3225198e7f3d49cc3edd57 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/test_tracer_context_nested.yaml b/tests/cassettes/test_tracer_context_nested.yaml new file mode 100644 index 0000000..ac49a91 --- /dev/null +++ b/tests/cassettes/test_tracer_context_nested.yaml @@ -0,0 +1,201 @@ +interactions: +- request: + body: '{"messages":[{"role":"user","content":"Hello World!"}],"model":"gpt-4"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + authorization: + - DUMMY + connection: + - keep-alive + content-length: + - '71' + content-type: + - application/json + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.57.1 + x-stainless-arch: + - x64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - Linux + x-stainless-package-version: + - 1.57.1 + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.6 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//jFJNTwIxFLzvr3j2DAZEELkYD36djNGTxmxK+1gq3b6mfRtdCf/ddPlY + iJh46WHmzXTmtcsMQBgtJiDUXLIqve1eL2R9N3i6sdXFy+Xj7No+L3x8fL2tv+/GRnSSgqYfqHir + OlVUeotsyK1pFVAyJtf+xWA4Go2Ho3FDlKTRJlnhuXve7Y36g41iTkZhFBN4ywAAls2ZsjmNX2IC + vc4WKTFGWaCY7IYARCCbECFjNJGlY9FpSUWO0TVx79FaOoF7+gQlHTzAWgA1VcCkZX21Lww4q6JM + gV1l7QZf7ZJYKnygadzwO3xmnInzPKCM5NKtkcmLhl1lAO9N4+qghPCBSs850wJdMuxvCot2t0dI + Jpa2xc+2+IFbrpGlsXFvY0JJNUfdKtv1ykob2iOyvc6/wxzzXvc2rviPfUsohZ5R5z6gNuqwcDsW + MP28v8Z2O24Ci1hHxjKfGVdg8ME0f6B5ylX2AwAA//8DAATOvT36AgAA + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8fac38897e616dc5-MIA + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 31 Dec 2024 18:09:29 GMT + Server: + - cloudflare + Set-Cookie: + - __cf_bm=E71sj8BgPlfHStPndCfIdMbuz2I7IILfT6MYMR6O05c-1735668569-1.0.1.1-3QctP69wJWwTM76kRblKg8m5S16SGixo_52RMFU2__IS.TchyW.eM3sl2IeYaSnH.IcdrqDnytcozX4H_0WXgQ; + path=/; expires=Tue, 31-Dec-24 18:39:29 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=QWRWX1JfB5JCTGRoMGJQ2MxwzDT2PuSTW1JIp5Ne3u0-1735668569446-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - user-sxsjo8cvghsvsqprrtasrxyq + openai-processing-ms: + - '780' + openai-version: + - '2020-10-01' + strict-transport-security: + - max-age=31536000; includeSubDomains; preload + x-ratelimit-limit-requests: + - '5000' + x-ratelimit-limit-tokens: + - '80000' + x-ratelimit-remaining-requests: + - '4999' + x-ratelimit-remaining-tokens: + - '79980' + x-ratelimit-reset-requests: + - 12ms + x-ratelimit-reset-tokens: + - 15ms + x-request-id: + - req_4620b0e0e7c7b2f54ba1f290bb10019f + status: + code: 200 + message: OK +- request: + body: '{"messages":[{"role":"user","content":"Hello World!"}],"model":"gpt-4"}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + authorization: + - DUMMY + connection: + - keep-alive + content-length: + - '71' + content-type: + - application/json + cookie: + - __cf_bm=E71sj8BgPlfHStPndCfIdMbuz2I7IILfT6MYMR6O05c-1735668569-1.0.1.1-3QctP69wJWwTM76kRblKg8m5S16SGixo_52RMFU2__IS.TchyW.eM3sl2IeYaSnH.IcdrqDnytcozX4H_0WXgQ; + _cfuvid=QWRWX1JfB5JCTGRoMGJQ2MxwzDT2PuSTW1JIp5Ne3u0-1735668569446-0.0.1.1-604800000 + host: + - api.openai.com + user-agent: + - OpenAI/Python 1.57.1 + x-stainless-arch: + - x64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - Linux + x-stainless-package-version: + - 1.57.1 + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.6 + method: POST + uri: https://api.openai.com/v1/chat/completions + response: + body: + string: !!binary | + H4sIAAAAAAAAAwAAAP//jFLLTsMwELznKxafW0R5BOgFoV7KS3AAcUAoMvY2NXW8xt4AEeq/I6eP + tAIkLj7M7Ixn1v7KAITRYghCTSWrytv++Uw24/zhdET1zfuoefMfk9ur6/uTx3DZ3IleUtDLKype + qXYVVd4iG3ILWgWUjMl1cHxwlOcnR/lpS1Sk0SZZ6bl/2N/LBwdLxZSMwiiG8JQBAHy1Z8rmNH6K + Iez1VkiFMcoSxXA9BCAC2YQIGaOJLB2LXkcqcoyujTtGa2kHxvQBSjq4gIUAGqqBScvmbFMYcFJH + mQK72tolPl8nsVT6QC9xya/xiXEmTouAMpJLt0YmL1p2ngE8t43rrRLCB6o8F0wzdMlwsCwsut3+ + QjKxtB2+v8K33AqNLI2NGxsTSqop6k7ZrVfW2tAGkW10/hnmN+9Fb+PK/9h3hFLoGXXhA2qjtgt3 + YwHTz/trbL3jNrCITWSsiolxJQYfTPsH2qecZ98AAAD//wMANuZV4/oCAAA= + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 8fac388f7c4f6dc5-MIA + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Tue, 31 Dec 2024 18:09:30 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + access-control-expose-headers: + - X-Request-ID + alt-svc: + - h3=":443"; ma=86400 + openai-organization: + - user-sxsjo8cvghsvsqprrtasrxyq + openai-processing-ms: + - '695' + openai-version: + - '2020-10-01' + strict-transport-security: + - max-age=31536000; includeSubDomains; preload + x-ratelimit-limit-requests: + - '5000' + x-ratelimit-limit-tokens: + - '80000' + x-ratelimit-remaining-requests: + - '4999' + x-ratelimit-remaining-tokens: + - '79980' + x-ratelimit-reset-requests: + - 12ms + x-ratelimit-reset-tokens: + - 15ms + x-request-id: + - req_6028961ec3fdcb9d881820c1cfaab25a + status: + code: 200 + message: OK +version: 1 diff --git a/tests/conftest.py b/tests/conftest.py index f793127..04499d4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -65,7 +65,7 @@ def tracer_init(docker_api_info): @pytest.fixture -def tracer_with_response_init(docker_api_info): +def tracer_with_sync_init(docker_api_info): from scope3ai import Scope3AI scope3 = Scope3AI.init( diff --git a/tests/test_openai_tracer.py b/tests/test_openai_tracer.py index e7082bb..a54bcb6 100644 --- a/tests/test_openai_tracer.py +++ b/tests/test_openai_tracer.py @@ -16,7 +16,7 @@ def test_openai_chat(tracer_init): @pytest.mark.vcr -def test_openai_chat_with_response(tracer_with_response_init): +def test_openai_chat_with_response(tracer_with_sync_init): client = OpenAI() response = client.chat.completions.create( model="gpt-4", messages=[{"role": "user", "content": "Hello World!"}] diff --git a/tests/test_tracer.py b/tests/test_tracer.py index 732437a..9a1c9d3 100644 --- a/tests/test_tracer.py +++ b/tests/test_tracer.py @@ -138,3 +138,113 @@ async def test_tracer_openai_simple_asynchronisation(tracer_init): tracer_init._worker.resume() await response.scope3ai.await_impact() assert response.scope3ai.impact is not None + + +@pytest.mark.vcr +def test_tracer_context(tracer_init): + from openai import OpenAI + + client = OpenAI() + with tracer_init.trace() as tracer: + response = client.chat.completions.create( + model="gpt-4", messages=[{"role": "user", "content": "Hello World!"}] + ) + assert len(response.choices) > 0 + impact = tracer.impact() + assert impact is not None + assert impact.total_energy_wh > 0 + assert impact.total_gco2e > 0 + assert impact.total_mlh2o > 0 + + +@pytest.mark.vcr +def test_tracer_context_nested(tracer_init): + from openai import OpenAI + + client = OpenAI() + with tracer_init.trace() as tracer: + response = client.chat.completions.create( + model="gpt-4", messages=[{"role": "user", "content": "Hello World!"}] + ) + assert len(response.choices) > 0 + + with tracer_init.trace() as tracer2: + response = client.chat.completions.create( + model="gpt-4", messages=[{"role": "user", "content": "Hello World!"}] + ) + assert len(response.choices) > 0 + impact = tracer2.impact() + assert impact is not None + assert impact.total_energy_wh > 0 + assert impact.total_gco2e > 0 + assert impact.total_mlh2o > 0 + + impact2 = tracer.impact() + assert impact2 is not None + assert impact2.total_energy_wh > impact.total_energy_wh + assert impact2.total_gco2e > impact.total_gco2e + assert impact2.total_mlh2o > impact.total_mlh2o + + +def test_tracer_submit_impact(tracer_init): + from scope3ai.api.types import ImpactRow, Model + + # pause the background worker + tracer_init._ensure_worker() + tracer_init._worker.pause() + + impact = ImpactRow(model=Model(id="gpt_4o"), input_tokens=100, output_tokens=100) + ctx = tracer_init.submit_impact(impact) + + assert ctx is not None + assert ctx.impact is None + + # resume the background worker + tracer_init._worker.resume() + + ctx.wait_impact() + assert ctx.impact is not None + + +def test_tracer_submit_impact_sync(tracer_with_sync_init): + from scope3ai.api.types import ImpactRow, Model + + impact = ImpactRow(model=Model(id="gpt_4o"), input_tokens=100, output_tokens=100) + ctx = tracer_with_sync_init.submit_impact(impact) + + assert ctx is not None + assert ctx.impact is not None + + +@pytest.mark.asyncio +async def test_tracer_submit_impact_async(tracer_init): + # XXX non fonctional test + from scope3ai.api.types import ImpactRow, Model + + # pause the background worker + tracer_init._ensure_worker() + tracer_init._worker.pause() + + impact = ImpactRow(model=Model(id="gpt_4o"), input_tokens=100, output_tokens=100) + ctx = await tracer_init.asubmit_impact(impact) + + assert ctx is not None + assert ctx.impact is None + + # resume the background worker + tracer_init._worker.resume() + + # Fully block at the moment. + # await ctx.await_impact() + # assert ctx.impact is not None + + +@pytest.mark.asyncio +async def test_tracer_submit_impact_sync_async(tracer_with_sync_init): + from scope3ai.api.types import ImpactRow, Model + + impact = ImpactRow(model=Model(id="gpt_4o"), input_tokens=100, output_tokens=100) + ctx = await tracer_with_sync_init.asubmit_impact(impact) + + assert ctx is not None + assert ctx.impact is not None