From 0e0b938ad00138fe14befd97e84048a04b772398 Mon Sep 17 00:00:00 2001 From: Thomas Capelle Date: Fri, 17 Jan 2025 19:26:52 +0100 Subject: [PATCH 01/17] feat(weave): Bedrock support (#3145) * minimal code * add shard, fix test * merge * add clean cassetter * lint * pseudo working stream * add a test (beware api keys may leak) * remove stuff * add bedrock * update bedrock tests * mock aws * missing region * lint * invoke test * add docs * strip meta * resolve ref for model_name * complete docs * lint --- .github/workflows/test.yaml | 1 + docs/docs/guides/integrations/bedrock.md | 137 ++++++++ .../integrations/imgs/bedrock_converse.png | Bin 0 -> 190226 bytes noxfile.py | 2 + pyproject.toml | 1 + tests/integrations/bedrock/bedrock_test.py | 302 ++++++++++++++++++ weave/integrations/bedrock/__init__.py | 1 + weave/integrations/bedrock/bedrock_sdk.py | 157 +++++++++ 8 files changed, 601 insertions(+) create mode 100644 docs/docs/guides/integrations/bedrock.md create mode 100644 docs/docs/guides/integrations/imgs/bedrock_converse.png create mode 100644 tests/integrations/bedrock/bedrock_test.py create mode 100644 weave/integrations/bedrock/__init__.py create mode 100644 weave/integrations/bedrock/bedrock_sdk.py diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 37adf9ddb309..0b444bd4e1e9 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -235,6 +235,7 @@ jobs: "trace", "trace_server", "anthropic", + "bedrock", "cerebras", "cohere", "dspy", diff --git a/docs/docs/guides/integrations/bedrock.md b/docs/docs/guides/integrations/bedrock.md new file mode 100644 index 000000000000..0fe0db80c0c7 --- /dev/null +++ b/docs/docs/guides/integrations/bedrock.md @@ -0,0 +1,137 @@ +# Amazon Bedrock + +Weave automatically tracks and logs LLM calls made via Amazon Bedrock, AWS's fully managed service that offers foundation models from leading AI companies through a unified API. + +## Traces + +Weave will automatically capture traces for Bedrock API calls. You can use the Bedrock client as usual after initializing Weave and patching the client: + +```python +import weave +import boto3 +import json +from weave.integrations.bedrock.bedrock_sdk import patch_client + +weave.init("my_bedrock_app") + +# Create and patch the Bedrock client +client = boto3.client("bedrock-runtime") +patch_client(client) + +# Use the client as usual +response = client.invoke_model( + modelId="anthropic.claude-3-5-sonnet-20240620-v1:0", + body=json.dumps({ + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 100, + "messages": [ + {"role": "user", "content": "What is the capital of France?"} + ] + }), + contentType='application/json', + accept='application/json' +) +response_dict = json.loads(response.get('body').read()) +print(response_dict["content"][0]["text"]) +``` + +of using the `converse` API: + +```python +messages = [{"role": "user", "content": [{"text": "What is the capital of France?"}]}] + +response = client.converse( + modelId="anthropic.claude-3-5-sonnet-20240620-v1:0", + system=[{"text": "You are a helpful AI assistant."}], + messages=messages, + inferenceConfig={"maxTokens": 100}, +) +print(response["output"]["message"]["content"][0]["text"]) + +``` + +## Wrapping with your own ops + +You can create reusable operations using the `@weave.op()` decorator. Here's an example showing both the `invoke_model` and `converse` APIs: + +```python +@weave.op +def call_model_invoke( + model_id: str, + prompt: str, + max_tokens: int = 100, + temperature: float = 0.7 +) -> dict: + body = json.dumps({ + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": max_tokens, + "temperature": temperature, + "messages": [ + {"role": "user", "content": prompt} + ] + }) + + response = client.invoke_model( + modelId=model_id, + body=body, + contentType='application/json', + accept='application/json' + ) + return json.loads(response.get('body').read()) + +@weave.op +def call_model_converse( + model_id: str, + messages: str, + system_message: str, + max_tokens: int = 100, +) -> dict: + response = client.converse( + modelId=model_id, + system=[{"text": system_message}], + messages=messages, + inferenceConfig={"maxTokens": max_tokens}, + ) + return response +``` + +![](./imgs/bedrock_converse.png) + +## Create a `Model` for easier experimentation + +You can create a Weave Model to better organize your experiments and capture parameters. Here's an example using the `converse` API: + +```python +class BedrockLLM(weave.Model): + model_id: str + max_tokens: int = 100 + system_message: str = "You are a helpful AI assistant." + + @weave.op + def predict(self, prompt: str) -> str: + "Generate a response using Bedrock's converse API" + + messages = [{ + "role": "user", + "content": [{"text": prompt}] + }] + + response = client.converse( + modelId=self.model_id, + system=[{"text": self.system_message}], + messages=messages, + inferenceConfig={"maxTokens": self.max_tokens}, + ) + return response["output"]["message"]["content"][0]["text"] + +# Create and use the model +model = BedrockLLM( + model_id="anthropic.claude-3-5-sonnet-20240620-v1:0", + max_tokens=100, + system_message="You are an expert software engineer that knows a lot of programming. You prefer short answers." +) +result = model.predict("What is the best way to handle errors in Python?") +print(result) +``` + +This approach allows you to version your experiments and easily track different configurations of your Bedrock-based application. diff --git a/docs/docs/guides/integrations/imgs/bedrock_converse.png b/docs/docs/guides/integrations/imgs/bedrock_converse.png new file mode 100644 index 0000000000000000000000000000000000000000..1e1fb281baf03a07538621c4a55ba3ea1ed07d76 GIT binary patch literal 190226 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 ) : ( )} @@ -95,12 +128,11 @@ export const ChoicesDrawer = ({ choice={c} isStructuredOutput={isStructuredOutput} choiceIndex={index} - isNested /> ))} - + ); }; diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ChatView/ChoicesViewCarousel.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ChatView/ChoicesViewCarousel.tsx index 3addbdded819..0612d7d8096f 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ChatView/ChoicesViewCarousel.tsx +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ChatView/ChoicesViewCarousel.tsx @@ -69,7 +69,7 @@ export const ChoicesViewCarousel = ({ icon="visible" onClick={() => setIsDrawerOpen(true)} tooltip="View all choices"> - Review + View trials } diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ChatView/MessagePanel.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ChatView/MessagePanel.tsx index 8cec95707fa7..560585fd10da 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ChatView/MessagePanel.tsx +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ChatView/MessagePanel.tsx @@ -122,8 +122,10 @@ export const MessagePanel = ({
{messageHeader} {isPlayground && editorHeight ? ( @@ -167,7 +169,7 @@ export const MessagePanel = ({ )}
- {isOverflowing && !editorHeight && ( + {isOverflowing && !hasToolCalls && !editorHeight && ( { return (
+ className={classNames('flex w-full items-center justify-center', { + 'pt-[4px]': isShowingMore, + [`absolute z-[1] mt-[-32px] rounded-b-xl bg-gradient-to-t from-70% pb-[4px] pt-[16px] ${ + isUser ? 'from-[#f4fbe8]' : 'from-white' + } to-transparent`]: !isShowingMore, + })}>

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.0.0"] pandas-test = ["pandas>=2.2.3"] modal = ["modal", "python-dotenv"] vertexai = ["vertexai>=1.70.0"] +bedrock = ["boto3", "moto[bedrock]>=5.0.24"] test = [ "nox", "pytest>=8.2.0", diff --git a/tests/integrations/bedrock/bedrock_test.py b/tests/integrations/bedrock/bedrock_test.py new file mode 100644 index 000000000000..79f7c743f307 --- /dev/null +++ b/tests/integrations/bedrock/bedrock_test.py @@ -0,0 +1,302 @@ +import io +import json +from unittest.mock import patch + +import boto3 +import botocore +import pytest +from moto import mock_aws + +import weave +from weave.integrations.bedrock import patch_client + +model_id = "anthropic.claude-3-5-sonnet-20240620-v1:0" +system_message = "You are an expert software engineer that knows a lot of programming. You prefer short answers." +messages = [ + { + "role": "user", + "content": [ + { + "text": ( + "In Bash, how do I list all text files in the current directory " + "(excluding subdirectories) that have been modified in the last month?" + ) + } + ], + } +] + +invoke_prompt = ( + "In Bash, how do I list all text files in the current directory " + "(excluding subdirectories) that have been modified in the last month?" +) + +# Mock responses +MOCK_CONVERSE_RESPONSE = { + "ResponseMetadata": { + "RequestId": "917ceb8d-3a0a-4649-b3bb-527494c17a69", + "HTTPStatusCode": 200, + "HTTPHeaders": { + "date": "Fri, 20 Dec 2024 16:44:08 GMT", + "content-type": "application/json", + "content-length": "323", + "connection": "keep-alive", + "x-amzn-requestid": "917ceb8d-3a0a-4649-b3bb-527494c17a69", + }, + "RetryAttempts": 0, + }, + "output": { + "message": { + "role": "assistant", + "content": [ + { + "text": "To list all text files in the current directory (excluding subdirectories) " + "that have been modified in the last month using Bash, you can use" + } + ], + } + }, + "stopReason": "max_tokens", + "usage": {"inputTokens": 40, "outputTokens": 30, "totalTokens": 70}, + "metrics": {"latencyMs": 838}, +} + +MOCK_STREAM_EVENTS = [ + {"messageStart": {"role": "assistant"}}, + {"contentBlockDelta": {"delta": {"text": "To"}, "contentBlockIndex": 0}}, + { + "contentBlockDelta": { + "delta": {"text": " list all text files"}, + "contentBlockIndex": 0, + } + }, + { + "contentBlockDelta": { + "delta": {"text": " in the current directory"}, + "contentBlockIndex": 0, + } + }, + {"contentBlockDelta": {"delta": {"text": " modifie"}, "contentBlockIndex": 0}}, + { + "contentBlockDelta": { + "delta": {"text": "d in the last month"}, + "contentBlockIndex": 0, + } + }, + {"contentBlockDelta": {"delta": {"text": ", use"}, "contentBlockIndex": 0}}, + {"contentBlockDelta": {"delta": {"text": ":"}, "contentBlockIndex": 0}}, + {"contentBlockDelta": {"delta": {"text": "\n\n```bash"}, "contentBlockIndex": 0}}, + {"contentBlockDelta": {"delta": {"text": "\nfind . -max"}, "contentBlockIndex": 0}}, + {"contentBlockDelta": {"delta": {"text": "depth "}, "contentBlockIndex": 0}}, + {"contentBlockDelta": {"delta": {"text": "1"}, "contentBlockIndex": 0}}, + {"contentBlockStop": {"contentBlockIndex": 0}}, + {"messageStop": {"stopReason": "max_tokens"}}, + { + "metadata": { + "usage": {"inputTokens": 55, "outputTokens": 30, "totalTokens": 85}, + "metrics": {"latencyMs": 926}, + } + }, +] + +MOCK_INVOKE_RESPONSE = { + "body": io.BytesIO( + json.dumps( + { + "id": "msg_bdrk_01WpFc3918C93ZG9ZMKVqzCd", + "type": "message", + "role": "assistant", + "model": "claude-3-5-sonnet-20240620", + "content": [ + { + "type": "text", + "text": "To list all text files in the current directory (excluding subdirectories) " + "that have been modified in the last month using Bash, you can use", + } + ], + "stop_reason": "end_turn", + "stop_sequence": None, + "usage": {"input_tokens": 40, "output_tokens": 30, "total_tokens": 70}, + } + ).encode("utf-8") + ), + "ContentType": "application/json", +} + +# Original botocore _make_api_call function +orig = botocore.client.BaseClient._make_api_call + + +def mock_converse_make_api_call(self, operation_name, kwarg): + if operation_name == "Converse": + return MOCK_CONVERSE_RESPONSE + elif operation_name == "ConverseStream": + + class MockStream: + def __iter__(self): + yield from MOCK_STREAM_EVENTS + + return {"stream": MockStream()} + return orig(self, operation_name, kwarg) + + +def mock_invoke_make_api_call(self, operation_name, kwarg): + if operation_name == "InvokeModel": + return MOCK_INVOKE_RESPONSE + return orig(self, operation_name, kwarg) + + +@pytest.mark.skip_clickhouse_client +@mock_aws +def test_bedrock_converse(client: weave.trace.weave_client.WeaveClient) -> None: + bedrock_client = boto3.client("bedrock-runtime", region_name="us-east-1") + patch_client(bedrock_client) + + with patch( + "botocore.client.BaseClient._make_api_call", new=mock_converse_make_api_call + ): + response = bedrock_client.converse( + modelId=model_id, + system=[{"text": system_message}], + messages=messages, + inferenceConfig={"maxTokens": 30}, + ) + + # Existing checks + assert response is not None + assert "output" in response + assert "message" in response["output"] + assert "content" in response["output"]["message"] + + # Now verify that a trace was captured. + calls = list(client.calls()) + assert len(calls) == 1, "Expected exactly one trace call" + call = calls[0] + + assert call.exception is None + assert call.ended_at is not None + + # Inspect the captured output if desired + output = call.output + + # Confirm we see the same text as in the mock response + assert ( + output["output"]["message"]["content"][0]["text"] + == "To list all text files in the current directory (excluding subdirectories) that have been modified in the last month using Bash, you can use" + ) + + # Check usage in a style similar to mistral tests + summary = call.summary + assert summary is not None, "Summary should not be None" + # We'll reference usage by the model_id + model_usage = summary["usage"][model_id] + assert model_usage["requests"] == 1, "Expected exactly one request increment" + # Map the tokens to pydantic usage fields + # "inputTokens" -> prompt_tokens, "outputTokens" -> completion_tokens + assert output["usage"]["inputTokens"] == model_usage["prompt_tokens"] == 40 + assert output["usage"]["outputTokens"] == model_usage["completion_tokens"] == 30 + assert output["usage"]["totalTokens"] == model_usage["total_tokens"] == 70 + + +@pytest.mark.skip_clickhouse_client +@mock_aws +def test_bedrock_converse_stream(client: weave.trace.weave_client.WeaveClient) -> None: + bedrock_client = boto3.client("bedrock-runtime", region_name="us-east-1") + patch_client(bedrock_client) + + with patch( + "botocore.client.BaseClient._make_api_call", new=mock_converse_make_api_call + ): + response = bedrock_client.converse_stream( + modelId=model_id, + system=[{"text": system_message}], + messages=messages, + inferenceConfig={"maxTokens": 30}, + ) + + # Existing checks + stream = response.get("stream") + assert stream is not None, "Stream not found in response" + + # Accumulate the streamed response + final_response = "" + for event in stream: + if "contentBlockDelta" in event: + final_response += event["contentBlockDelta"]["delta"]["text"] + + assert final_response is not None + + # Now verify that a trace was captured. + calls = list(client.calls()) + assert len(calls) == 1, "Expected exactly one trace call for the stream test" + call = calls[0] + + assert call.exception is None + assert call.ended_at is not None + + output = call.output + # For a streaming response, you might confirm final partial text is present + # in the final output or usage data is recorded + + assert "To list all text files" in output["content"] + + # Check usage in a style similar to mistral tests + summary = call.summary + assert summary is not None, "Summary should not be None" + model_usage = summary["usage"][model_id] + assert model_usage["requests"] == 1 + assert output["usage"]["inputTokens"] == model_usage["prompt_tokens"] == 55 + assert output["usage"]["outputTokens"] == model_usage["completion_tokens"] == 30 + assert output["usage"]["totalTokens"] == model_usage["total_tokens"] == 85 + + +@pytest.mark.skip_clickhouse_client +@mock_aws +def test_bedrock_invoke(client: weave.trace.weave_client.WeaveClient) -> None: + bedrock_client = boto3.client("bedrock-runtime", region_name="us-east-1") + patch_client(bedrock_client) + + with patch( + "botocore.client.BaseClient._make_api_call", new=mock_invoke_make_api_call + ): + # Call the custom op that wraps the bedrock_client.invoke_model call + body = json.dumps( + { + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 30, + "temperature": 0.7, + "messages": [{"role": "user", "content": invoke_prompt}], + } + ) + + response = bedrock_client.invoke_model( + modelId=model_id, + body=body, + contentType="application/json", + accept="application/json", + ) + response = json.loads(response.get("body").read()) + # Basic assertions on the response + assert response is not None + assert "type" in response + assert response["type"] == "message" + assert "content" in response + assert response["content"][0]["text"].startswith( + "To list all text files in the current directory" + ) + + # Check that a trace was captured + calls = list(client.calls()) + assert len(calls) == 1, "Expected exactly one trace call for invoke command" + call = calls[0] + assert call.exception is None + assert call.ended_at is not None + + output = call.output + assert "body" in output + # Confirm usage in the summary + summary = call.summary + print(summary) + assert summary is not None, "Summary should not be None" + model_usage = summary["usage"][model_id] + assert model_usage["requests"] == 1 diff --git a/weave/integrations/bedrock/__init__.py b/weave/integrations/bedrock/__init__.py new file mode 100644 index 000000000000..dae3fb55679e --- /dev/null +++ b/weave/integrations/bedrock/__init__.py @@ -0,0 +1 @@ +from .bedrock_sdk import patch_client as patch_client diff --git a/weave/integrations/bedrock/bedrock_sdk.py b/weave/integrations/bedrock/bedrock_sdk.py new file mode 100644 index 000000000000..d122810a8320 --- /dev/null +++ b/weave/integrations/bedrock/bedrock_sdk.py @@ -0,0 +1,157 @@ +from typing import TYPE_CHECKING, Any, Callable, Optional + +import weave +from weave.trace.op_extensions.accumulator import _IteratorWrapper, add_accumulator +from weave.trace.weave_client import Call + +if TYPE_CHECKING: + from botocore.client import BaseClient + + +def bedrock_on_finish_converse( + call: Call, output: Any, exception: Optional[BaseException] +) -> None: + model_name = str(call.inputs["modelId"]) # get the ref + usage = {model_name: {"requests": 1}} + summary_update = {"usage": usage} + if output: + tokens_metrics = { + "prompt_tokens": output["usage"]["inputTokens"], + "completion_tokens": output["usage"]["outputTokens"], + "total_tokens": output["usage"]["totalTokens"], + } + usage[model_name].update(tokens_metrics) + if call.summary is not None: + call.summary.update(summary_update) + + +def bedrock_on_finish_invoke( + call: Call, output: Any, exception: Optional[BaseException] +) -> None: + model_name = str(call.inputs["modelId"]) + usage = {model_name: {"requests": 1}} + summary_update = {"usage": usage} + + if output and "ResponseMetadata" in output: + headers = output["ResponseMetadata"]["HTTPHeaders"] + prompt_tokens = int(headers.get("x-amzn-bedrock-input-token-count", 0)) + completion_tokens = int(headers.get("x-amzn-bedrock-output-token-count", 0)) + total_tokens = prompt_tokens + completion_tokens + + tokens_metrics = { + "prompt_tokens": prompt_tokens, + "completion_tokens": completion_tokens, + "total_tokens": total_tokens, + } + usage[model_name].update(tokens_metrics) + if call.summary is not None: + call.summary.update(summary_update) + + +def postprocess_inputs(inputs: dict[str, Any]) -> dict[str, Any]: + return inputs.get("kwargs", {}) + + +def _patch_converse(bedrock_client: "BaseClient") -> None: + op = weave.op( + bedrock_client.converse, + name="BedrockRuntime.converse", + postprocess_inputs=postprocess_inputs, + ) + op._set_on_finish_handler(bedrock_on_finish_converse) + bedrock_client.converse = op + + +def _patch_invoke(bedrock_client: "BaseClient") -> None: + op = weave.op( + bedrock_client.invoke_model, + name="BedrockRuntime.invoke", + postprocess_inputs=postprocess_inputs, + ) + op._set_on_finish_handler(bedrock_on_finish_invoke) + bedrock_client.invoke_model = op + + +def bedrock_stream_accumulator( + acc: Optional[dict], + value: dict, +) -> dict: + """Accumulates streaming events into a final response dictionary.""" + if acc is None: + acc = { + "role": None, + "content": "", + "stop_reason": None, + "usage": { + "inputTokens": 0, + "outputTokens": 0, + "totalTokens": 0, + }, + "latency_ms": None, + } + + # Handle 'messageStart' event + if "messageStart" in value: + acc["role"] = value["messageStart"]["role"] + + # Handle 'contentBlockDelta' event + if "contentBlockDelta" in value: + acc["content"] += value["contentBlockDelta"]["delta"]["text"] + + # Handle 'messageStop' event + if "messageStop" in value: + acc["stop_reason"] = value["messageStop"]["stopReason"] + + # Handle 'metadata' event + if "metadata" in value: + metadata = value["metadata"] + if "usage" in metadata: + acc["usage"]["inputTokens"] = metadata["usage"].get("inputTokens", 0) + acc["usage"]["outputTokens"] = metadata["usage"].get("outputTokens", 0) + acc["usage"]["totalTokens"] = metadata["usage"].get("totalTokens", 0) + if "metrics" in metadata: + acc["latency_ms"] = metadata["metrics"].get("latencyMs", 0) + + return acc + + +def create_stream_wrapper( + name: str, +) -> Callable[[Callable], Callable]: + def wrapper(fn: Callable) -> Callable: + op = weave.op(postprocess_inputs=postprocess_inputs)(fn) + op.name = name # type: ignore + op._set_on_finish_handler(bedrock_on_finish_converse) + + class BedrockIteratorWrapper(_IteratorWrapper): + def get(self, key: str, default: Any = None) -> Any: + """Delegate 'get' method to the response object.""" + if key == "stream": + if hasattr(self._iterator_or_ctx_manager, "get"): + self._iterator_or_ctx_manager = ( + self._iterator_or_ctx_manager.get("stream") + ) + return self + + return add_accumulator( + op, + make_accumulator=lambda _: bedrock_stream_accumulator, + should_accumulate=lambda _: True, + iterator_wrapper=BedrockIteratorWrapper, + ) + + return wrapper + + +def _patch_converse_stream(bedrock_client: "BaseClient") -> None: + """Patches the converse_stream method to handle streaming.""" + op = create_stream_wrapper("BedrockRuntime.converse_stream")( + bedrock_client.converse_stream + ) + bedrock_client.converse_stream = op + + +def patch_client(bedrock_client: "BaseClient") -> None: + _patch_converse(bedrock_client) + _patch_invoke(bedrock_client) + _patch_converse_stream(bedrock_client) From b708fa5596f2367c7f0b97c5f1280e9434e3904e Mon Sep 17 00:00:00 2001 From: Weave Build Bot Date: Fri, 17 Jan 2025 18:46:01 +0000 Subject: [PATCH 02/17] =?UTF-8?q?Release=20version:=200.51.29-dev0=20?= =?UTF-8?q?=E2=86=92=200.51.29?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- weave/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4f1ebf39a345..dc479ac21122 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -230,7 +230,7 @@ module = "weave_query.*" ignore_errors = true [tool.bumpversion] -current_version = "0.51.29-dev0" +current_version = "0.51.29" parse = """(?x) (?P0|[1-9]\\d*)\\. (?P0|[1-9]\\d*)\\. diff --git a/weave/version.py b/weave/version.py index 3455631df34e..6f0698634565 100644 --- a/weave/version.py +++ b/weave/version.py @@ -44,4 +44,4 @@ """ -VERSION = "0.51.29-dev0" +VERSION = "0.51.29" From bc71f82137adbba48b06ddb75090d06a3ddb162c Mon Sep 17 00:00:00 2001 From: Weave Build Bot Date: Fri, 17 Jan 2025 18:46:02 +0000 Subject: [PATCH 03/17] =?UTF-8?q?Release=20version:=200.51.29=20=E2=86=92?= =?UTF-8?q?=200.51.30-dev0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- weave/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index dc479ac21122..a63468df2d7b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -230,7 +230,7 @@ module = "weave_query.*" ignore_errors = true [tool.bumpversion] -current_version = "0.51.29" +current_version = "0.51.30-dev0" parse = """(?x) (?P0|[1-9]\\d*)\\. (?P0|[1-9]\\d*)\\. diff --git a/weave/version.py b/weave/version.py index 6f0698634565..e8df345374e4 100644 --- a/weave/version.py +++ b/weave/version.py @@ -44,4 +44,4 @@ """ -VERSION = "0.51.29" +VERSION = "0.51.30-dev0" From 2e698f52fee8afef887b7a369b3cf8e6cb3b15eb Mon Sep 17 00:00:00 2001 From: Griffin Tarpenning Date: Fri, 17 Jan 2025 11:04:35 -0800 Subject: [PATCH 04/17] chore(ui): a better "use" tab experience for annotation specs (#3404) --- .../pages/ObjectsPage/ObjectVersionPage.tsx | 8 ++ .../ObjectsPage/Tabs/TabUseAnnotationSpec.tsx | 114 ++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/Tabs/TabUseAnnotationSpec.tsx diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/ObjectVersionPage.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/ObjectVersionPage.tsx index 601af6eaf0b2..d4702509c0dc 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/ObjectVersionPage.tsx +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/ObjectVersionPage.tsx @@ -44,6 +44,7 @@ import { } from '../wfReactInterface/wfDataModelHooksInterface'; import {DeleteObjectButtonWithModal} from './ObjectDeleteButtons'; import {TabPrompt} from './Tabs/TabPrompt'; +import {TabUseAnnotationSpec} from './Tabs/TabUseAnnotationSpec'; import {TabUseModel} from './Tabs/TabUseModel'; import {TabUseObject} from './Tabs/TabUseObject'; @@ -394,6 +395,13 @@ const ObjectVersionPageInner: React.FC<{ uri={refUri} projectName={projectName} /> + ) : baseObjectClass === 'AnnotationSpec' ? ( + ) : ( )} diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/Tabs/TabUseAnnotationSpec.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/Tabs/TabUseAnnotationSpec.tsx new file mode 100644 index 000000000000..95b442bff91d --- /dev/null +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/ObjectsPage/Tabs/TabUseAnnotationSpec.tsx @@ -0,0 +1,114 @@ +import {Box} from '@material-ui/core'; +import {CopyableText} from '@wandb/weave/components/CopyableText'; +import {isValidVarName} from '@wandb/weave/core/util/var'; +import {abbreviateRef} from '@wandb/weave/util/refs'; +import React from 'react'; + +import {DocLink} from '../../common/Links'; +import {TabUseBanner} from '../../common/TabUseBanner'; +import {AnnotationSpec} from '../../wfReactInterface/generatedBuiltinObjectClasses.zod'; + +type TabUseAnnotationSpecProps = { + name: string; + uri: string; + projectName: string; + data?: AnnotationSpec; +}; + +export const TabUseAnnotationSpec = ({ + name, + uri, + projectName, + data, +}: TabUseAnnotationSpecProps) => { + const fullSpecName = `wandb.annotation.${name}`; + const pythonName = isValidVarName(name) ? name : 'annotation_spec'; + const payloadValue = makeAnnotationPayloadFromSpec(data?.field_schema); + const abbreviatedAnnotationCode = makeAnnotateCallCode( + abbreviateRef(uri), + payloadValue, + fullSpecName, + projectName + ); + const fullAnnotationCode = makeAnnotateCallCode( + uri, + payloadValue, + fullSpecName, + projectName + ); + + return ( + + + See{' '} + {' '} + for more information. + + + + The ref for this annotation is: + + + + Use the following code to retrieve this annotation spec: + + + + Use the following code to annotate calls with this annotation spec: + + + + ); +}; + +const makeAnnotateCallCode = ( + uri: string, + payloadValue: string, + fullSpecName: string, + projectName: string +) => `client = weave.init('${projectName}') + +call = client.get_calls()[0] +call.feedback.add( + feedback_type='${fullSpecName}', + payload={"value": ${payloadValue}}, + annotation_ref='${uri}' +)`; + +const makeAnnotationPayloadFromSpec = ( + spec?: AnnotationSpec['field_schema'] +): string => { + if (spec?.type === 'string') { + if (spec.enum) { + return `"${spec.enum[0] ?? 'Yes'}"`; + } + const strMsg = 'A great call!'; + if ( + !spec.max_length || + (spec.max_length && spec.max_length >= strMsg.length) + ) { + return `"${strMsg}"`; + } + return '"Nice!"'; + } + if (spec?.type === 'number' || spec?.type === 'integer') { + return `${spec.maximum ?? spec.minimum ?? 10}`; + } + if (spec?.type === 'boolean') { + return 'True'; + } + return '"Nice!"'; +}; From 0f4b31d921b45f53e08add7aa3991bfa09d7e2ad Mon Sep 17 00:00:00 2001 From: Griffin Tarpenning Date: Fri, 17 Jan 2025 11:05:07 -0800 Subject: [PATCH 05/17] chore(ui): update export code to use get_calls (#3408) --- .../pages/CallsPage/CallsTableButtons.tsx | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallsPage/CallsTableButtons.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallsPage/CallsTableButtons.tsx index e6956fb3d4a8..a69b358fc633 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallsPage/CallsTableButtons.tsx +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallsPage/CallsTableButtons.tsx @@ -529,28 +529,24 @@ function makeCodeText( sortBy: Array<{field: string; direction: 'asc' | 'desc'}>, includeFeedback: boolean ) { - let codeStr = `import weave\nassert weave.__version__ >= "0.50.14", "Please upgrade weave!" \n\nclient = weave.init("${entity}/${project}")`; - codeStr += `\ncalls = client.server.calls_query_stream({\n`; - codeStr += ` "project_id": "${entity}/${project}",\n`; - + let codeStr = `import weave\nassert weave.__version__ >= "0.51.29", "Please upgrade weave!"\n\nclient = weave.init("${project}")`; + codeStr += `\ncalls = client.get_calls(\n`; const filteredCallIds = callIds ?? filter.callIds; if (filteredCallIds && filteredCallIds.length > 0) { - codeStr += ` "filter": {"call_ids": ["${filteredCallIds.join( - '", "' - )}"]},\n`; + codeStr += ` filter={"call_ids": ["${filteredCallIds.join('", "')}"]},\n`; if (expandColumns.length > 0) { const expandColumnsStr = JSON.stringify(expandColumns, null, 0); - codeStr += ` "expand_columns": ${expandColumnsStr},\n`; + codeStr += ` expand_columns=${expandColumnsStr},\n`; } if (includeFeedback) { - codeStr += ` "include_feedback": true,\n`; + codeStr += ` include_feedback=True,\n`; } // specifying call_ids ignores other filters, return early codeStr += `})`; return codeStr; } if (Object.values(filter).some(value => value !== undefined)) { - codeStr += ` "filter": {`; + codeStr += ` filter={`; if (filter.opVersionRefs) { codeStr += `"op_names": ["${filter.opVersionRefs.join('", "')}"],`; } @@ -573,21 +569,21 @@ function makeCodeText( codeStr += `},\n`; } if (query) { - codeStr += ` "query": ${JSON.stringify(query, null, 0)},\n`; + codeStr += ` query=${JSON.stringify(query, null, 0)},\n`; } if (expandColumns.length > 0) { const expandColumnsStr = JSON.stringify(expandColumns, null, 0); - codeStr += ` "expand_columns": ${expandColumnsStr},\n`; + codeStr += ` expand_columns=${expandColumnsStr},\n`; } if (sortBy.length > 0) { - codeStr += ` "sort_by": ${JSON.stringify(sortBy, null, 0)},\n`; + codeStr += ` sort_by=${JSON.stringify(sortBy, null, 0)},\n`; } if (includeFeedback) { - codeStr += ` "include_feedback": True,\n`; + codeStr += ` include_feedback=True,\n`; } - codeStr += `})`; + codeStr += `)`; return codeStr; } From 5197346bda3837f8852bf9b572808cd664ff7e18 Mon Sep 17 00:00:00 2001 From: Jamie Rasmussen <112953339+jamie-rasmussen@users.noreply.github.com> Date: Fri, 17 Jan 2025 13:14:25 -0600 Subject: [PATCH 06/17] chore(weave): fix typo (#3435) --- weave/trace/op_type.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weave/trace/op_type.py b/weave/trace/op_type.py index 1e71beb6dd60..41cba6030d63 100644 --- a/weave/trace/op_type.py +++ b/weave/trace/op_type.py @@ -346,7 +346,7 @@ def _get_code_deps( warnings: list[str] = [] if depth > 20: warnings = [ - "Recursion depth exceeded in get_code_deps, this may indicate circular depenencies, which are not yet handled." + "Recursion depth exceeded in get_code_deps, this may indicate circular dependencies, which are not yet handled." ] return {"import_code": [], "code": [], "warnings": warnings} From d9cc936c25b9468ed2feb8f87bb268b1c1c2d4ca Mon Sep 17 00:00:00 2001 From: Martin Mark Date: Tue, 21 Jan 2025 09:22:13 -0500 Subject: [PATCH 07/17] chore(ui): Added operator group headers to filter dropdown (#3306) * Adding operator group headers * Lint fix * Lint * Updated labels * Massaged groups into `allOperators` * Lint --- .../Home/Browse3/filters/FilterRow.tsx | 9 ++- .../Home/Browse3/filters/SelectOperator.tsx | 19 ++++-- .../Home/Browse3/filters/common.ts | 63 +++++++++++++++++-- 3 files changed, 79 insertions(+), 12 deletions(-) diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/filters/FilterRow.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/filters/FilterRow.tsx index e0444c4d6398..333690383255 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/filters/FilterRow.tsx +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/filters/FilterRow.tsx @@ -6,7 +6,12 @@ import {GridFilterItem} from '@mui/x-data-grid-pro'; import React, {useMemo} from 'react'; import {Button} from '../../../../Button'; -import {FilterId, getFieldType, getOperatorOptions, isWeaveRef} from './common'; +import { + FilterId, + getFieldType, + getGroupedOperatorOptions, + isWeaveRef, +} from './common'; import {SelectField, SelectFieldOption} from './SelectField'; import {SelectOperator} from './SelectOperator'; import {SelectValue} from './SelectValue'; @@ -36,7 +41,7 @@ export const FilterRow = ({ }; const operatorOptions = useMemo( - () => getOperatorOptions(item.field), + () => getGroupedOperatorOptions(item.field), [item.field] ); diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/filters/SelectOperator.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/filters/SelectOperator.tsx index 01966b1fa7c1..45ae20c796bf 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/filters/SelectOperator.tsx +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/filters/SelectOperator.tsx @@ -3,12 +3,13 @@ */ import {Select} from '@wandb/weave/components/Form/Select'; import React from 'react'; +import {components, GroupHeadingProps} from 'react-select'; import {Tooltip} from '../../../../Tooltip'; -import {SelectOperatorOption} from './common'; +import {OperatorGroupedOption, SelectOperatorOption} from './common'; type SelectOperatorProps = { - options: SelectOperatorOption[]; + options: OperatorGroupedOption[]; value: string; onSelectOperator: (value: string) => void; isDisabled?: boolean; @@ -24,13 +25,22 @@ const OptionLabel = (props: SelectOperatorOption) => { ); }; +const GroupHeading = ( + props: GroupHeadingProps +) => { + return ; +}; + export const SelectOperator = ({ options, value, onSelectOperator, isDisabled, }: SelectOperatorProps) => { - const selectedOption = options.find(o => o.value === value) ?? options[0]; + // Find the operator from the grouped selection: + const flattenedOptions = options.flatMap(group => group.options); + const selectedOption = + flattenedOptions.find(o => o.value === value) ?? flattenedOptions[0]; const onReactSelectChange = (option: SelectOperatorOption | null) => { if (option) { @@ -39,13 +49,14 @@ export const SelectOperator = ({ }; return ( - + options={options} value={selectedOption} placeholder="Select operator" onChange={onReactSelectChange} formatOptionLabel={OptionLabel} isDisabled={isDisabled} + components={{GroupHeading}} /> ); }; diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/filters/common.ts b/weave-js/src/components/PagePanelComponents/Home/Browse3/filters/common.ts index a0abb3c6801c..f8603c86b44a 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/filters/common.ts +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/filters/common.ts @@ -75,64 +75,108 @@ export const getFieldType = (field: string): string => { return FIELD_TYPE[field] ?? 'text'; }; -const allOperators = [ +export type OperatorGroup = 'string' | 'number' | 'boolean' | 'date' | 'any'; +export type SelectOperatorOption = { + label: string; + value: string; + group: OperatorGroup; +}; + +const allOperators: SelectOperatorOption[] = [ { value: '(string): contains', label: 'contains', + group: 'string', }, { value: '(string): equals', label: 'equals', + group: 'string', }, { value: '(string): in', label: 'in', + group: 'string', }, { value: '(number): =', label: '=', + group: 'number', }, { value: '(number): !=', label: '≠', + group: 'number', }, { value: '(number): <', label: '<', + group: 'number', }, { value: '(number): <=', label: '≤', + group: 'number', }, { value: '(number): >', label: '>', + group: 'number', }, { value: '(number): >=', label: '≥', + group: 'number', }, { value: '(bool): is', label: 'is', + group: 'boolean', }, { value: '(date): after', label: 'after', + group: 'date', }, { value: '(date): before', label: 'before', + group: 'date', }, { value: '(any): isEmpty', label: 'is empty', + group: 'any', }, { value: '(any): isNotEmpty', label: 'is not empty', + group: 'any', }, ]; + +// Display labels +const GROUP_LABELS: Record = { + string: 'Text', + number: 'Number', + boolean: 'Boolean', + date: 'Date', + any: 'Other', +}; + +export function getGroupedOperatorOptions( + field: string +): OperatorGroupedOption[] { + // Get operators / operator groups + const availableOperators = getOperatorOptions(field); + const groups = [...new Set(availableOperators.map(op => op.group))]; + // Create grouped options + return groups.map(group => ({ + label: GROUP_LABELS[group], + options: availableOperators.filter(op => op.group === group), + })); +} + const operatorLabels: Record = allOperators.reduce( (acc, operator) => { acc[operator.value] = operator.label; @@ -151,11 +195,6 @@ export const isNumericOperator = (operator: string) => { return operator.startsWith('(number):'); }; -export type SelectOperatorOption = { - value: string; - label: string; -}; - export const getOperatorLabel = (operatorValue: string): string => { const label = operatorLabels[operatorValue]; if (label) { @@ -184,10 +223,12 @@ export const getOperatorOptions = (field: string): SelectOperatorOption[] => { { value: '(string): equals', label: 'equals', + group: 'string', }, { value: '(string): in', label: 'in', + group: 'string', }, ]; } @@ -196,10 +237,12 @@ export const getOperatorOptions = (field: string): SelectOperatorOption[] => { { value: '(date): after', label: 'after', + group: 'date', }, { value: '(date): before', label: 'before', + group: 'date', }, ]; } @@ -208,10 +251,12 @@ export const getOperatorOptions = (field: string): SelectOperatorOption[] => { { value: 'is', label: 'is', + group: 'boolean', }, { value: 'is not', label: 'is not', + group: 'boolean', }, ]; } @@ -220,6 +265,7 @@ export const getOperatorOptions = (field: string): SelectOperatorOption[] => { { value: '(string): equals', label: 'equals', + group: 'string', }, ]; } @@ -312,3 +358,8 @@ export const upsertFilter = ( items, }; }; + +export type OperatorGroupedOption = { + label: string; + options: SelectOperatorOption[]; +}; From a8fb72736f67ba801f2b86a9d75033565687cef1 Mon Sep 17 00:00:00 2001 From: Thomas Capelle Date: Tue, 21 Jan 2025 16:02:28 +0100 Subject: [PATCH 08/17] add bedrock to sidebar (#3443) --- docs/sidebars.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/sidebars.ts b/docs/sidebars.ts index d3d3ebf575e7..0e2ace26cdb7 100644 --- a/docs/sidebars.ts +++ b/docs/sidebars.ts @@ -98,6 +98,7 @@ const sidebars: SidebarsConfig = { "guides/integrations/cohere", "guides/integrations/mistral", "guides/integrations/azure", + "guides/integrations/bedrock", "guides/integrations/google-gemini", "guides/integrations/together_ai", "guides/integrations/groq", From 540cf683fa1be4675da8a2d80e166abad74f1051 Mon Sep 17 00:00:00 2001 From: Jamie Rasmussen <112953339+jamie-rasmussen@users.noreply.github.com> Date: Tue, 21 Jan 2025 11:06:25 -0600 Subject: [PATCH 09/17] feat(weave): allow disabling autopatch (#3442) --- scripts/benchmark_init.py | 98 +++++++++++++++++++++++++++++++++++++++ weave/trace/autopatch.py | 11 +++-- 2 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 scripts/benchmark_init.py diff --git a/scripts/benchmark_init.py b/scripts/benchmark_init.py new file mode 100644 index 000000000000..7cd54eb61081 --- /dev/null +++ b/scripts/benchmark_init.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 + +import argparse +import statistics +import subprocess +import sys +from datetime import datetime + +from rich.console import Console +from rich.progress import Progress, SpinnerColumn, TimeElapsedColumn +from rich.table import Table + +from weave.trace.autopatch import AutopatchSettings + + +def today() -> str: + return datetime.today().date().strftime("%Y-%m-%d") + + +def run_single_init(disable_autopatch: bool = False): + projname = today() + "_benchmark_init" + cmd = rf""" +import time +import weave +start = time.perf_counter() +weave.init("{projname}", autopatch_settings={{"disable_autopatch": {disable_autopatch}}}) +end = time.perf_counter() +print(end - start) +""" + result = subprocess.run([sys.executable, "-c", cmd], capture_output=True, text=True) + # Get the last line of output (Skipping "Logged in as Weights & Biases user...") + output = result.stdout.strip().split("\n")[-1] + print(output) + return float(output) + + +def benchmark(iterations: int = 10, disable_autopatch: bool = False): + projname = today() + "_benchmark_init" + # Ensure project exists + import weave + + weave.init(projname, autopatch_settings=AutopatchSettings(disable_autopatch=True)) + + console = Console() + times = [] + + with Progress( + SpinnerColumn(), + *Progress.get_default_columns(), + TimeElapsedColumn(), + console=console, + ) as progress: + task = progress.add_task("[cyan]Running init tests...", total=iterations) + + for _ in range(iterations): + times.append(run_single_init(disable_autopatch)) + progress.advance(task) + + # Display results in a nice table + table = Table(title="Init Time Benchmark Results") + table.add_column("Metric", style="cyan") + table.add_column("Value", style="green") + + table.add_row("Mean init time", f"{statistics.mean(times):.4f}s") + table.add_row("Median init time", f"{statistics.median(times):.4f}s") + table.add_row("Std dev", f"{statistics.stdev(times):.4f}s") + table.add_row("Min time", f"{min(times):.4f}s") + table.add_row("Max time", f"{max(times):.4f}s") + + console.print("\n") + console.print(table) + + # Show individual times + times_table = Table(title="Individual Init Times") + times_table.add_column("Run #", style="cyan") + times_table.add_column("Time (seconds)", style="green") + + for i, t in enumerate(times, 1): + times_table.add_row(str(i), f"{t:.4f}") + + console.print("\n") + console.print(times_table) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Benchmark weave.init performance") + parser.add_argument( + "--disable-autopatch", action="store_true", help="Disable autopatching" + ) + parser.add_argument( + "--iterations", + type=int, + default=10, + help="Number of iterations to run (default: 10)", + ) + args = parser.parse_args() + + benchmark(iterations=args.iterations, disable_autopatch=args.disable_autopatch) diff --git a/weave/trace/autopatch.py b/weave/trace/autopatch.py index bc77752957c2..f7237bca0cd7 100644 --- a/weave/trace/autopatch.py +++ b/weave/trace/autopatch.py @@ -32,7 +32,8 @@ class IntegrationSettings(BaseModel): class AutopatchSettings(BaseModel): """Settings for auto-patching integrations.""" - # These will be uncommented as we add support for more integrations. Note that + # If True, other autopatch settings are ignored. + disable_autopatch: bool = False anthropic: IntegrationSettings = Field(default_factory=IntegrationSettings) cerebras: IntegrationSettings = Field(default_factory=IntegrationSettings) @@ -51,6 +52,11 @@ class AutopatchSettings(BaseModel): @validate_call def autopatch(settings: Optional[AutopatchSettings] = None) -> None: + if settings is None: + settings = AutopatchSettings() + if settings.disable_autopatch: + return + from weave.integrations.anthropic.anthropic_sdk import get_anthropic_patcher from weave.integrations.cerebras.cerebras_sdk import get_cerebras_patcher from weave.integrations.cohere.cohere_sdk import get_cohere_patcher @@ -71,9 +77,6 @@ def autopatch(settings: Optional[AutopatchSettings] = None) -> None: from weave.integrations.openai.openai_sdk import get_openai_patcher from weave.integrations.vertexai.vertexai_sdk import get_vertexai_patcher - if settings is None: - settings = AutopatchSettings() - get_openai_patcher(settings.openai).attempt_patch() get_mistral_patcher(settings.mistral).attempt_patch() get_litellm_patcher(settings.litellm).attempt_patch() From 7d2f62272d3b3ba4f3d81c145e947d1f992d2598 Mon Sep 17 00:00:00 2001 From: Tim Sweeney Date: Tue, 21 Jan 2025 12:38:54 -0800 Subject: [PATCH 10/17] chore(weave): Re-enable to_dict support in serialization layer (#3438) * init * init * lint --- weave/trace/serialization/dictifiable.py | 32 ++++++++++++++++++++++++ weave/trace/serialize.py | 9 +++++++ 2 files changed, 41 insertions(+) create mode 100644 weave/trace/serialization/dictifiable.py diff --git a/weave/trace/serialization/dictifiable.py b/weave/trace/serialization/dictifiable.py new file mode 100644 index 000000000000..4136ee1f9da0 --- /dev/null +++ b/weave/trace/serialization/dictifiable.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +from typing import Any, Protocol, runtime_checkable + + +@runtime_checkable +class Dictifiable(Protocol): + """Protocol for objects that can be converted to a dictionary representation.""" + + def to_dict(self) -> dict[str, Any]: + """Convert the object to a dictionary representation.""" + ... + + +def try_to_dict(obj: Any) -> dict[str, Any] | None: + """ + Attempt to convert an object to a dictionary using the Dictifiable protocol. + + Args: + obj: Object to attempt to convert to dictionary + + Returns: + Dictionary representation if object implements Dictifiable protocol, None otherwise + """ + if isinstance(obj, Dictifiable): + try: + res = obj.to_dict() + if isinstance(res, dict): + return res + except Exception: + return None + return None diff --git a/weave/trace/serialize.py b/weave/trace/serialize.py index 77d58bd03a25..f54b6fc7af85 100644 --- a/weave/trace/serialize.py +++ b/weave/trace/serialize.py @@ -9,6 +9,7 @@ from weave.trace.object_record import ObjectRecord from weave.trace.refs import ObjectRef, TableRef, parse_uri from weave.trace.sanitize import REDACTED_VALUE, should_redact +from weave.trace.serialization.dictifiable import try_to_dict from weave.trace_server.interface.builtin_object_classes.builtin_object_registry import ( BUILTIN_OBJECT_REGISTRY, ) @@ -57,6 +58,14 @@ def to_json( and not has_custom_repr(obj) ): return dictify(obj) + + # TODO: I would prefer to only have this once in dictify? Maybe dictify and to_json need to be merged? + # However, even if dictify is false, i still want to try to convert to dict + elif as_dict := try_to_dict(obj): + return { + k: to_json(v, project_id, client, use_dictify) + for k, v in as_dict.items() + } return fallback_encode(obj) result = _build_result_from_encoded(encoded, project_id, client) From 92dbec750fbb9fb546bb03c6ccbc657ea2ffe730 Mon Sep 17 00:00:00 2001 From: Jamie Rasmussen <112953339+jamie-rasmussen@users.noreply.github.com> Date: Tue, 21 Jan 2025 15:12:09 -0600 Subject: [PATCH 11/17] chore(ui): add tooltip to Op version delete button (#3445) --- .../Home/Browse3/pages/OpsPage/OpVersionPage.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/OpsPage/OpVersionPage.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/OpsPage/OpVersionPage.tsx index 7fd54a8ecbc0..41a3b61bfdba 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/OpsPage/OpVersionPage.tsx +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/OpsPage/OpVersionPage.tsx @@ -201,6 +201,7 @@ const DeleteOpButtonWithModal: React.FC<{ icon="delete" variant="ghost" onClick={() => setDeleteModalOpen(true)} + tooltip="Delete this Op version" /> Date: Tue, 21 Jan 2025 14:35:28 -0800 Subject: [PATCH 12/17] chore(weave): Add new FAQ to Calls page (#3448) * other question * other question --- docs/docs/guides/tracking/tracing.mdx | 73 +++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 11 deletions(-) diff --git a/docs/docs/guides/tracking/tracing.mdx b/docs/docs/guides/tracking/tracing.mdx index fbdf6bea96f9..d098d4781dca 100644 --- a/docs/docs/guides/tracking/tracing.mdx +++ b/docs/docs/guides/tracking/tracing.mdx @@ -5,6 +5,7 @@ import TracingCallsMacroImage from '@site/static/img/screenshots/calls_macro.png import TracingCallsFilterImage from '@site/static/img/screenshots/calls_filter.png'; import BasicCallImage from '@site/static/img/screenshots/basic_call.png'; + # Calls Date: Tue, 21 Jan 2025 14:45:28 -0800 Subject: [PATCH 13/17] fix(ui): all strings are clickable in object viewer (#3437) --- .../pages/CallPage/ValueViewString.tsx | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallPage/ValueViewString.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallPage/ValueViewString.tsx index 0e017b929feb..2de53bffead0 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallPage/ValueViewString.tsx +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallPage/ValueViewString.tsx @@ -39,13 +39,13 @@ const Spacer = styled.div` `; Spacer.displayName = 'S.Spacer'; -const Collapsed = styled.div<{hasScrolling: boolean}>` +const Collapsed = styled.div` min-height: 38px; line-height: 38px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - cursor: ${props => (props.hasScrolling ? 'pointer' : 'default')}; + cursor: pointer; `; Collapsed.displayName = 'S.Collapsed'; @@ -100,12 +100,10 @@ export const ValueViewString = ({value, isExpanded}: ValueViewStringProps) => { setMode(hasScrolling ? (isExpanded ? 1 : 0) : 0); }, [hasScrolling, isExpanded]); - const onClick = hasScrolling - ? () => { - const numModes = hasFull ? 3 : 2; - setMode((mode + 1) % numModes); - } - : undefined; + const onClick = () => { + const numModes = hasFull ? 3 : 2; + setMode((mode + 1) % numModes); + }; const copy = useCallback(() => { copyToClipboard(value); toast('Copied to clipboard'); @@ -209,9 +207,5 @@ export const ValueViewString = ({value, isExpanded}: ValueViewStringProps) => { ); } - return ( - - {content} - - ); + return {content}; }; From 71e123e0664d9951cef55002dbef97800a3fe78e Mon Sep 17 00:00:00 2001 From: Jamie Rasmussen <112953339+jamie-rasmussen@users.noreply.github.com> Date: Tue, 21 Jan 2025 16:57:27 -0600 Subject: [PATCH 14/17] chore(docs): small docs fix (#3451) --- docs/docs/guides/tracking/tracing.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guides/tracking/tracing.mdx b/docs/docs/guides/tracking/tracing.mdx index d098d4781dca..e0efd4cd4453 100644 --- a/docs/docs/guides/tracking/tracing.mdx +++ b/docs/docs/guides/tracking/tracing.mdx @@ -749,7 +749,7 @@ In situations where you want to unconditionally disable tracing for the entire p **Client Initialization:** -Sometimes, you may want to conditionally enable tracing for a specific initialization based on some condition. In this case, you can initialize the client with the `tracing_enabled` flag. +Sometimes, you may want to conditionally enable tracing for a specific initialization based on some condition. In this case, you can initialize the client with the `disabled` flag in init settings. ```python import weave From b573c04f82491d4bf30dd4634bd155151b0e51a4 Mon Sep 17 00:00:00 2001 From: Jamie Rasmussen <112953339+jamie-rasmussen@users.noreply.github.com> Date: Tue, 21 Jan 2025 16:57:44 -0600 Subject: [PATCH 15/17] feat(ui): allow specifying page size in grid (#3434) --- .../Home/Browse3/grid/pagination.ts | 2 +- .../Browse3/pages/CallPage/CallDetails.tsx | 1 + .../Browse3/pages/CallsPage/CallsTable.tsx | 4 +- .../pages/CallsPage/CallsTableButtons.tsx | 112 +++++++++++++----- .../views/Leaderboard/LeaderboardGrid.tsx | 2 +- 5 files changed, 89 insertions(+), 32 deletions(-) diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/grid/pagination.ts b/weave-js/src/components/PagePanelComponents/Home/Browse3/grid/pagination.ts index ed9adf9d22a2..45eea688a37e 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/grid/pagination.ts +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/grid/pagination.ts @@ -1,7 +1,7 @@ import {GridPaginationModel} from '@mui/x-data-grid-pro'; const MAX_PAGE_SIZE = 100; -export const DEFAULT_PAGE_SIZE = 100; +export const DEFAULT_PAGE_SIZE = 50; export const getValidPaginationModel = ( queryPage: string | undefined, diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallPage/CallDetails.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallPage/CallDetails.tsx index 03519960bf37..3e2cb8886771 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallPage/CallDetails.tsx +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallPage/CallDetails.tsx @@ -189,6 +189,7 @@ export const CallDetails: FC<{ entity={call.entity} project={call.project} allowedColumnPatterns={ALLOWED_COLUMN_PATTERNS} + paginationModel={isPeeking ? {page: 0, pageSize: 10} : undefined} /> ); if (isPeeking) { diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallsPage/CallsTable.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallsPage/CallsTable.tsx index 3632664aaf09..fd8ac8c888e6 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallsPage/CallsTable.tsx +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallsPage/CallsTable.tsx @@ -941,7 +941,6 @@ export const CallsTable: FC<{ paginationMode="server" paginationModel={paginationModel} onPaginationModelChange={onPaginationModelChange} - pageSizeOptions={[DEFAULT_PAGE_SIZE]} // PAGINATION SECTION END rowHeight={38} columns={muiColumns} @@ -949,6 +948,7 @@ export const CallsTable: FC<{ rowSelectionModel={rowSelectionModel} // columnGroupingModel={groupingModel} columnGroupingModel={columns.colGroupingModel} + hideFooter={!callsLoading && callsTotal === 0} hideFooterSelectedRowCount onColumnWidthChange={newCol => { setUserDefinedColumnWidths(curr => { @@ -1022,7 +1022,7 @@ export const CallsTable: FC<{ ); }, columnMenu: CallsCustomColumnMenu, - pagination: PaginationButtons, + pagination: () => , columnMenuSortDescendingIcon: IconSortDescending, columnMenuSortAscendingIcon: IconSortAscending, columnMenuHideIcon: IconNotVisible, diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallsPage/CallsTableButtons.tsx b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallsPage/CallsTableButtons.tsx index a69b358fc633..52e31390c85c 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallsPage/CallsTableButtons.tsx +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/CallsPage/CallsTableButtons.tsx @@ -26,6 +26,7 @@ import classNames from 'classnames'; import React, {Dispatch, FC, SetStateAction, useRef, useState} from 'react'; import * as userEvents from '../../../../../../integrations/analytics/userEvents'; +import {Select} from '../../../../../Form/Select'; import {useWFHooks} from '../wfReactInterface/context'; import {Query} from '../wfReactInterface/traceServerClientInterface/query'; import { @@ -642,7 +643,16 @@ curl '${baseUrl}/calls/stream_query' \\ return baseCurl; } -export const PaginationButtons = () => { +type PageSizeOption = { + readonly value: number; + readonly label: string; +}; + +type PaginationButtonsProps = { + hideControls?: boolean; +}; + +export const PaginationButtons = ({hideControls}: PaginationButtonsProps) => { const apiRef = useGridApiContext(); const page = useGridSelector(apiRef, gridPageSelector); const pageCount = useGridSelector(apiRef, gridPageCountSelector); @@ -661,35 +671,81 @@ export const PaginationButtons = () => { const start = rowCount > 0 ? page * pageSize + 1 : 0; const end = Math.min(rowCount, (page + 1) * pageSize); + const pageSizes = [10, 25, 50, 100]; + if (!pageSizes.includes(pageSize)) { + pageSizes.push(pageSize); + pageSizes.sort((a, b) => a - b); + } + const pageSizeOptions = pageSizes.map(sz => ({ + value: sz, + label: sz.toString(), + })); + const pageSizeValue = pageSizeOptions.find(o => o.value === pageSize); + const onPageSizeChange = (option: PageSizeOption | null) => { + if (option) { + apiRef.current.setPageSize(option.value); + } + }; + return ( - - +