Ana içeriğe geç

Dapr Conversation Task (Type: 20)

Dapr Conversation Task (type: "20"), bir LLM/AI sağlayıcısını Dapr'ın Conversation building block'u üzerinden çağırır. Böylece iş akışları; OpenAI, Anthropic, AWS Bedrock gibi sağlayıcılara sağlayıcı-bağımsız tek bir arayüzle prompt gönderebilir — diğer Dapr task türlerinin kullandığı aynı Dapr sidecar üzerinden.

Sağlayıcı seçimi ve kimlik bilgileri domain'e ait bir Dapr conversation component'inde (ör. openai) tanımlanır; task yalnızca o component'in adını (componentName) ve mesajları (inputs) referans verir. Runtime bileşenini eklemek için bkz. vnext-helm-charts #28.

Görev Tanımı

Schema: task-definition.schema.json

{
"key": "summarize-complaint",
"version": "1.0.0",
"domain": "core",
"flow": "sys-tasks",
"flowVersion": "1.0.0",
"tags": ["ai", "llm", "conversation"],
"attributes": {
"type": "20",
"config": {
"componentName": "openai",
"inputs": [
{ "role": "system", "content": "Sen bir müşteri şikayeti özetleyicisisin." },
{ "role": "user", "content": "Şikayet metnini 2 cümlede özetle." }
],
"parameters": {
"model": "gpt-4o-mini",
"maxTokens": "512"
},
"temperature": 0.2,
"scrubPII": true,
"timeoutSeconds": 30
}
}
}

Konfigürasyon Alanları

AlanTipZorunluVarsayılanAçıklama
componentNamestringEvetDapr conversation component adı (yapılandırılmış LLM sağlayıcısı), ör. openai
inputsarrayHayırKonuşma girdileri: role/content mesajlarından oluşan dizi (aşağıya bakın)
parametersobjectHayırSağlayıcıya özgü string parametreler (ör. model, maxTokens). Component'e olduğu gibi iletilir
metadataobjectHayırİstekle iletilen Dapr component metadata'sı (string değerler)
contextIdstringHayırDurumlu (stateful) bir konuşmayı sürdürmek için bağlam tanımlayıcısı
temperaturenumberHayırÖrnekleme sıcaklığı (sampling temperature)
scrubPIIbooleanHayırtrue ise sağlayıcıdan prompt ve yanıtlarda PII temizliği (scrub) istenir
timeoutSecondsintegerHayır30Timeout süresi (saniye, minimum: 1)

inputs Mesaj Yapısı

Her girdi bir rol/içerik mesajıdır:

{ "role": "user", "content": "...", "scrubPII": true, "name": "opsiyonel" }
AlanDeğerlerAçıklama
roleuser, system, assistant, developer, toolMesajın rolü
contentstringMesaj içeriği
scrubPIIboolean (ops.)Bu mesaj için PII temizliği
namestring (ops.)Mesaj için opsiyonel ad

Property Erişimi

Değerler çoğunlukla statik konfigürasyon yerine input mapping içinde dinamik olarak atanır.

PropertySetter MetoduAçıklama
ComponentNameSetComponentName(string componentName)Conversation component adı
InputsSetInputs(dynamic inputs)Mesaj dizisi
ParametersSetParameters(Dictionary<string, string?> parameters)Sağlayıcı parametreleri
MetadataSetMetadata(Dictionary<string, string?> metadata)Component metadata'sı
ContextIdSetContextId(string? contextId)Bağlam tanımlayıcısı
TemperatureSetTemperature(double? temperature)Örnekleme sıcaklığı
ScrubPIISetScrubPII(bool? scrubPII)PII temizliği
TimeoutSecondsSetTimeoutSeconds(int? timeoutSeconds)Timeout süresi

Input mapping örneği:

public class SummarizeComplaintMapping : ScriptBase, IMapping
{
public Task<ScriptResponse> InputHandler(WorkflowTask task, ScriptContext context)
{
var conversation = task as DaprConversationTask;
conversation.SetComponentName("openai");
conversation.SetInputs(new[]
{
new { role = "system", content = "Sen bir müşteri şikayeti özetleyicisisin." },
new { role = "user", content = (string)context.Instance.Data.complaintText }
});
conversation.SetParameters(new Dictionary<string, string?>
{
["model"] = "gpt-4o-mini",
["maxTokens"] = "512"
});
return Task.FromResult(new ScriptResponse());
}

public Task<ScriptResponse> OutputHandler(ScriptContext context)
{
var summary = context.Body?.outputs?[0]?.result;
return Task.FromResult(new ScriptResponse { Data = new { summary } });
}
}

Standart Yanıt

Yanıt, sağlayıcının döndürdüğü çıktı(lar)ı outputs altında taşır:

{
"Data": {
"outputs": [
{ "result": "Müşteri, kartının teslim edilmediğini ve çağrı merkezine ulaşamadığını bildiriyor." }
]
},
"StatusCode": 200,
"IsSuccess": true,
"ErrorMessage": null,
"TaskType": "20"
}

İlgili