From 495bf2cb91ddc3129af2e34093522ebae2eddffd Mon Sep 17 00:00:00 2001 From: Yevgen Polyak Date: Wed, 24 Jul 2024 11:56:02 +1200 Subject: [PATCH 1/4] Propagate trace inforation from incoming headers Signed-off-by: Yevgen Polyak --- .../en/operations/observability/tracing/tracing-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/observability/tracing/tracing-overview.md b/daprdocs/content/en/operations/observability/tracing/tracing-overview.md index 603e5d121..a5194a730 100644 --- a/daprdocs/content/en/operations/observability/tracing/tracing-overview.md +++ b/daprdocs/content/en/operations/observability/tracing/tracing-overview.md @@ -63,7 +63,7 @@ You must propagate the headers from `service A` to `service B`. For example: `In ##### Pub/sub messages -Dapr generates the trace headers in the published message topic. These trace headers are propagated to any services listening on that topic. +Dapr generates the trace headers in the published message topic. For `rawPayload` messages, it is possible to specify the `traceparent` header to propagate the tracing information. These trace headers are propagated to any services listening on that topic. #### Propagating multiple different service calls From fb6e11f2711f021409ac9c5099a5df4e756cc75b Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Fri, 10 Jan 2025 16:06:05 -0500 Subject: [PATCH 2/4] beef up overview, update example prompt Signed-off-by: Hannah Hunter --- .../conversation/conversation-overview.md | 23 +++++++++++++++---- .../conversation/howto-conversation-layer.md | 6 ++--- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md b/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md index f7621517e..6630b566f 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md @@ -10,18 +10,33 @@ description: "Overview of the conversation API building block" The conversation API is currently in [alpha]({{< ref "certification-lifecycle.md#certification-levels" >}}). {{% /alert %}} - Using the Dapr conversation API, you can reduce the complexity of interacting with Large Language Models (LLMs) and enable critical performance and security functionality with features like prompt caching and personally identifiable information (PII) data obfuscation. +Dapr's conversation API reduces the complexity of securely and reliably interacting with Large Language Models (LLM) at scale. Whether you're a developer who doesn't have the necessary native SDKs or a polyglot shop who just wants to focus on the prompt aspects of LLM interactions, the conversation API provides one consistent API entry point to talk to underlying LLM providers. + +In additon to enabling critical performance and security functionality (like [prompt caching]({{< ref "#prompt-caching" >}}) and [PII scrubbing]({{< ref "#personally-identifiable-information-pii-obfuscation" >}})), you can also pair the conversation API with Dapr functionalities, like: +- Resiliency circuit breakers and retries to circumvent limit and token errors, or +- Middleware to authenticate requests coming to and from the LLM + +Dapr provides observability by issuing metrics for your LLM interactions. + ## Features +The following features are out-of-the-box for [all the supported conversation components]({{< ref supported-conversation >}}). + ### Prompt caching -To significantly reduce latency and cost, frequent prompts are stored in a cache to be reused, instead of reprocessing the information for every new request. Prompt caching optimizes performance by storing and reusing prompts that are often repeated across multiple API calls. +Prompt caching optimizes performance by storing and reusing prompts that are often repeated across multiple API calls. To significantly reduce latency and cost, Dapr stores frequent prompts in a local cache to be reused by your cluster, pod, or other, instead of reprocessing the information for every new request. ### Personally identifiable information (PII) obfuscation -The PII obfuscation feature identifies and removes any PII from a conversation response. This feature protects your privacy by eliminating sensitive details like names, addresses, phone numbers, or other details that could be used to identify an individual. +The PII obfuscation feature identifies and removes any form of sensitve user information from a conversation response. Simply enable PII obfuscation on input and output data to protect your privacy and scrub sensitive details that could be used to identify an individual. + +## Demo + +Watch the demo presented during [Diagrid's Dapr v1.15 celebration](https://www.diagrid.io/videos/dapr-1-15-deep-dive) to see how the conversation API works using the .NET SDK. + + ## Try out conversation @@ -31,7 +46,7 @@ Want to put the Dapr conversation API to the test? Walk through the following qu | Quickstart/tutorial | Description | | ------------------- | ----------- | -| [Conversation quickstart](todo) | . | +| [Conversation quickstart](todo) | TODO | ### Start using the conversation API directly in your app diff --git a/daprdocs/content/en/developing-applications/building-blocks/conversation/howto-conversation-layer.md b/daprdocs/content/en/developing-applications/building-blocks/conversation/howto-conversation-layer.md index 0d35d860b..2c33e0595 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/conversation/howto-conversation-layer.md +++ b/daprdocs/content/en/developing-applications/building-blocks/conversation/howto-conversation-layer.md @@ -92,7 +92,7 @@ func main() { } input := dapr.ConversationInput{ - Message: "hello world", + Message: "Please write a witty haiku about the Dapr distributed programming framework at dapr.io", // Role: nil, // Optional // ScrubPII: nil, // Optional } @@ -134,7 +134,7 @@ async fn main() -> Result<(), Box> { let mut client = DaprClient::connect(address).await?; - let input = ConversationInputBuilder::new("hello world").build(); + let input = ConversationInputBuilder::new("Please write a witty haiku about the Dapr distributed programming framework at dapr.io").build(); let conversation_component = "echo"; @@ -179,7 +179,7 @@ dapr run --app-id conversation --dapr-grpc-port 50001 --log-level debug --resour **Expected output** ``` - - '== APP == conversation output: hello world' + - '== APP == conversation output: Please write a witty haiku about the Dapr distributed programming framework at dapr.io' ``` {{% /codetab %}} From ef808da0bfa882d59bbbdafd42b8eb484c14be66 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Mon, 13 Jan 2025 15:12:54 -0500 Subject: [PATCH 3/4] add diagram Signed-off-by: Hannah Hunter --- .../conversation/conversation-overview.md | 2 ++ .../static/images/conversation-overview.png | Bin 0 -> 45248 bytes 2 files changed, 2 insertions(+) create mode 100644 daprdocs/static/images/conversation-overview.png diff --git a/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md b/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md index 6630b566f..237314ac3 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md @@ -12,6 +12,8 @@ The conversation API is currently in [alpha]({{< ref "certification-lifecycle.md Using the Dapr conversation API, you can reduce the complexity of interacting with Large Language Models (LLMs) and enable critical performance and security functionality with features like prompt caching and personally identifiable information (PII) data obfuscation. +Diagram showing the flow of a user's app communicating with Dapr's LLM components. + Dapr's conversation API reduces the complexity of securely and reliably interacting with Large Language Models (LLM) at scale. Whether you're a developer who doesn't have the necessary native SDKs or a polyglot shop who just wants to focus on the prompt aspects of LLM interactions, the conversation API provides one consistent API entry point to talk to underlying LLM providers. In additon to enabling critical performance and security functionality (like [prompt caching]({{< ref "#prompt-caching" >}}) and [PII scrubbing]({{< ref "#personally-identifiable-information-pii-obfuscation" >}})), you can also pair the conversation API with Dapr functionalities, like: diff --git a/daprdocs/static/images/conversation-overview.png b/daprdocs/static/images/conversation-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..5bfa33ddd49840e3bf833e1200d7484445d27bd8 GIT binary patch literal 45248 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%0AWg$rPW7a1ZM5I&c92ANH5U}RnX2ssPGR}q# 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 Date: Fri, 17 Jan 2025 20:48:18 -0500 Subject: [PATCH 4/4] removing old paragraph (#4494) Signed-off-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> --- .../building-blocks/conversation/conversation-overview.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md b/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md index 237314ac3..595870e27 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/conversation/conversation-overview.md @@ -10,12 +10,10 @@ description: "Overview of the conversation API building block" The conversation API is currently in [alpha]({{< ref "certification-lifecycle.md#certification-levels" >}}). {{% /alert %}} -Using the Dapr conversation API, you can reduce the complexity of interacting with Large Language Models (LLMs) and enable critical performance and security functionality with features like prompt caching and personally identifiable information (PII) data obfuscation. +Dapr's conversation API reduces the complexity of securely and reliably interacting with Large Language Models (LLM) at scale. Whether you're a developer who doesn't have the necessary native SDKs or a polyglot shop who just wants to focus on the prompt aspects of LLM interactions, the conversation API provides one consistent API entry point to talk to underlying LLM providers. Diagram showing the flow of a user's app communicating with Dapr's LLM components. -Dapr's conversation API reduces the complexity of securely and reliably interacting with Large Language Models (LLM) at scale. Whether you're a developer who doesn't have the necessary native SDKs or a polyglot shop who just wants to focus on the prompt aspects of LLM interactions, the conversation API provides one consistent API entry point to talk to underlying LLM providers. - In additon to enabling critical performance and security functionality (like [prompt caching]({{< ref "#prompt-caching" >}}) and [PII scrubbing]({{< ref "#personally-identifiable-information-pii-obfuscation" >}})), you can also pair the conversation API with Dapr functionalities, like: - Resiliency circuit breakers and retries to circumvent limit and token errors, or - Middleware to authenticate requests coming to and from the LLM @@ -57,4 +55,4 @@ Want to skip the quickstarts? Not a problem. You can try out the conversation bu ## Next steps - [How-To: Converse with an LLM using the conversation API]({{< ref howto-conversation-layer.md >}}) -- [Conversation API components]({{< ref supported-conversation >}}) \ No newline at end of file +- [Conversation API components]({{< ref supported-conversation >}})