Skip to content

Commit 15d00f1

Browse files
committed
feat: update new parameters
1 parent 4db2990 commit 15d00f1

36 files changed

+1565
-231
lines changed

README.zh-Hans.md

Lines changed: 527 additions & 99 deletions
Large diffs are not rendered by default.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Cnblogs.DashScope.Core;
2+
3+
namespace Cnblogs.DashScope.Sample;
4+
5+
public interface ISample
6+
{
7+
string Description { get; }
8+
Task RunAsync(IDashScopeClient client);
9+
}

sample/Cnblogs.DashScope.Sample/Program.cs

Lines changed: 15 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Text.Json;
44
using Cnblogs.DashScope.Core;
55
using Cnblogs.DashScope.Sample;
6+
using Cnblogs.DashScope.Sample.Text;
67
using Cnblogs.DashScope.Sdk;
78
using Cnblogs.DashScope.Sdk.QWen;
89
using Cnblogs.DashScope.Sdk.TextEmbedding;
@@ -22,107 +23,29 @@
2223

2324
var dashScopeClient = new DashScopeClient(apiKey!);
2425

26+
var samples = typeof(ChatSample).Assembly.GetTypes()
27+
.Where(t => t.IsAssignableTo(typeof(ISample)) && t is { IsClass: true, IsAbstract: false })
28+
.Select(x => Activator.CreateInstance(x) as ISample)
29+
.Where(x => x != null)
30+
.Select(x => x!)
31+
.ToList();
32+
2533
Console.WriteLine("Choose the sample you want to run:");
26-
foreach (var sampleType in Enum.GetValues<SampleType>())
34+
for (var i = 0; i < samples.Count; i++)
2735
{
28-
Console.WriteLine($"{(int)sampleType}.{sampleType.GetDescription()}");
36+
Console.WriteLine($"{i}. {samples[i].Description}");
2937
}
3038

3139
Console.WriteLine();
3240
Console.Write("Choose an option: ");
33-
var type = (SampleType)int.Parse(Console.ReadLine()!);
34-
35-
string userInput;
36-
switch (type)
41+
var parsed = int.TryParse(Console.ReadLine()?.Trim(), out var index);
42+
if (parsed == false)
3743
{
38-
case SampleType.TextCompletion:
39-
Console.Write("Prompt > ");
40-
userInput = Console.ReadLine()!;
41-
await TextCompletionAsync(userInput);
42-
break;
43-
case SampleType.TextCompletionSse:
44-
Console.Write("Prompt > ");
45-
userInput = Console.ReadLine()!;
46-
await TextCompletionStreamAsync(userInput);
47-
break;
48-
case SampleType.ChatCompletion:
49-
await ChatStreamAsync();
50-
break;
51-
case SampleType.ChatCompletionWithTool:
52-
await ChatWithToolsAsync();
53-
break;
54-
case SampleType.MultimodalCompletion:
55-
await ChatWithImageAsync();
56-
break;
57-
case SampleType.ChatCompletionWithFiles:
58-
await ChatWithFilesAsync();
59-
break;
60-
case SampleType.Text2Image:
61-
await Text2ImageAsync();
62-
break;
63-
case SampleType.MicrosoftExtensionsAi:
64-
await ChatWithMicrosoftExtensions();
65-
break;
66-
case SampleType.MicrosoftExtensionsAiToolCall:
67-
await dashScopeClient.ToolCallWithExtensionAsync();
68-
break;
69-
case SampleType.ApplicationCall:
70-
Console.Write("Application Id > ");
71-
var applicationId = Console.ReadLine()!;
72-
Console.Write("Prompt > ");
73-
userInput = Console.ReadLine()!;
74-
await ApplicationCallAsync(applicationId, userInput);
75-
break;
76-
case SampleType.TextToSpeech:
77-
{
78-
using var tts = await dashScopeClient.CreateSpeechSynthesizerSocketSessionAsync("cosyvoice-v2");
79-
var taskId = await tts.RunTaskAsync(
80-
new SpeechSynthesizerParameters { Voice = "longxiaochun_v2", Format = "mp3" });
81-
await tts.ContinueTaskAsync(taskId, "博客园");
82-
await tts.ContinueTaskAsync(taskId, "代码改变世界");
83-
await tts.FinishTaskAsync(taskId);
84-
var file = new FileInfo("tts.mp3");
85-
await using var stream = file.OpenWrite();
86-
await foreach (var b in tts.GetAudioAsync())
87-
{
88-
stream.WriteByte(b);
89-
}
90-
91-
stream.Close();
92-
93-
var tokenUsage = 0;
94-
await foreach (var message in tts.GetMessagesAsync())
95-
{
96-
if (message.Payload.Usage?.Characters > tokenUsage)
97-
{
98-
tokenUsage = message.Payload.Usage.Characters;
99-
}
100-
}
101-
102-
Console.WriteLine($"audio saved to {file.FullName}, token usage: {tokenUsage}");
103-
break;
104-
}
105-
106-
case SampleType.TextEmbedding:
107-
Console.Write("text> ");
108-
var text = Console.ReadLine();
109-
if (string.IsNullOrEmpty(text))
110-
{
111-
text = "Coding changes world";
112-
Console.WriteLine($"using default text: {text}");
113-
}
114-
115-
var response = await dashScopeClient.GetTextEmbeddingsAsync(
116-
TextEmbeddingModel.TextEmbeddingV3,
117-
[text],
118-
new TextEmbeddingParameters() { Dimension = 512, });
119-
var array = response.Output.Embeddings.First().Embedding;
120-
Console.WriteLine("Embedding");
121-
Console.WriteLine(string.Join('\n', array));
122-
Console.WriteLine($"Token usage: {response.Usage?.TotalTokens}");
123-
break;
44+
Console.WriteLine("Invalid choice");
45+
return;
12446
}
12547

48+
await samples[index].RunAsync(dashScopeClient);
12649
return;
12750

12851
// text completion
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using Cnblogs.DashScope.Core;
2+
3+
namespace Cnblogs.DashScope.Sample.Text;
4+
5+
public class ChatReasoningSample : ISample
6+
{
7+
/// <inheritdoc />
8+
public string Description => "Chat with reasoning content";
9+
10+
/// <inheritdoc />
11+
public async Task RunAsync(IDashScopeClient client)
12+
{
13+
var messages = new List<TextChatMessage>();
14+
messages.Add(TextChatMessage.System("You are a helpful assistant"));
15+
while (true)
16+
{
17+
Console.Write("User > ");
18+
var input = Console.ReadLine();
19+
if (string.IsNullOrEmpty(input))
20+
{
21+
Console.WriteLine("Please enter a user input.");
22+
return;
23+
}
24+
25+
messages.Add(TextChatMessage.User(input));
26+
var completion = await client.GetTextCompletionAsync(
27+
new ModelRequest<TextGenerationInput, ITextGenerationParameters>()
28+
{
29+
Model = "qwen-turbo",
30+
Input = new TextGenerationInput() { Messages = messages },
31+
Parameters = new TextGenerationParameters() { ResultFormat = "message", EnableThinking = true }
32+
});
33+
Console.WriteLine("Reasoning > " + completion.Output.Choices![0].Message.ReasoningContent);
34+
Console.WriteLine("Assistant > " + completion.Output.Choices![0].Message.Content);
35+
var usage = completion.Usage;
36+
if (usage != null)
37+
{
38+
Console.WriteLine(
39+
$"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/reasoning({usage.OutputTokensDetails?.ReasoningTokens})/total({usage.TotalTokens})");
40+
}
41+
42+
messages.Add(TextChatMessage.Assistant(completion.Output.Choices[0].Message.Content));
43+
}
44+
}
45+
}
46+
47+
/*
48+
User > 你好,今天感觉怎么样?
49+
Reasoning > 好的,用户问“你好,今天感觉怎么样?”,我需要先理解他的意图。他可能是在关心我的状态,或者想开始一段对话。作为AI助手,我没有真实的情感,但应该以友好和积极的方式回应。
50+
51+
首先,我应该感谢他的问候,然后说明自己没有真实的情感,但愿意帮助他。接下来,可以询问他的情况,表现出关心,这样能促进进一步的交流。同时,保持语气自然,避免过于机械。
52+
53+
要注意用户可能的深层需求,比如他可能想寻求帮助,或者只是闲聊。所以回应要开放,让他知道我随时准备协助。另外,使用表情符号可以增加亲切感,但不要过多。
54+
55+
最后,确保回答简洁,不过于冗长,同时保持友好和专业。这样用户会觉得被重视,并且更愿意继续对话。
56+
Assistant > 你好呀!虽然我没有真实的情感体验,但很高兴能和你聊天!今天过得怎么样呢?有什么我可以帮你的吗?
57+
Usage: in(24)/out(203)/reasoning(169)/total(227)
58+
*/
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using Cnblogs.DashScope.Core;
2+
3+
namespace Cnblogs.DashScope.Sample.Text;
4+
5+
public class ChatSample : ISample
6+
{
7+
/// <inheritdoc />
8+
public string Description => "Basic chat completion";
9+
10+
/// <inheritdoc />
11+
public async Task RunAsync(IDashScopeClient client)
12+
{
13+
var messages = new List<TextChatMessage>();
14+
messages.Add(TextChatMessage.System("You are a helpful assistant"));
15+
while (true)
16+
{
17+
Console.Write("User > ");
18+
var input = Console.ReadLine();
19+
if (string.IsNullOrEmpty(input))
20+
{
21+
Console.WriteLine("使用默认输入:你是谁?");
22+
input = "你是谁?";
23+
}
24+
25+
messages.Add(TextChatMessage.User(input));
26+
var completion = await client.GetTextCompletionAsync(
27+
new ModelRequest<TextGenerationInput, ITextGenerationParameters>()
28+
{
29+
Model = "qwen-turbo",
30+
Input = new TextGenerationInput() { Messages = messages },
31+
Parameters = new TextGenerationParameters() { ResultFormat = "message" }
32+
});
33+
Console.WriteLine("Assistant > " + completion.Output.Choices![0].Message.Content);
34+
var usage = completion.Usage;
35+
if (usage != null)
36+
{
37+
Console.WriteLine($"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/total({usage.TotalTokens})");
38+
}
39+
40+
messages.Add(TextChatMessage.Assistant(completion.Output.Choices[0].Message.Content));
41+
}
42+
}
43+
}
44+
45+
/*
46+
* User > 你好,你今天过的怎么样?
47+
* Assistant > 你好!谢谢你关心。虽然我是一个AI助手,没有真实的情感和体验,但我非常高兴能和你交流。今天过得挺好的,因为我可以和很多像你一样的朋友聊天,帮助大家解决问题,分享知识。你今天过得怎么样呢?有什么我可以帮你的吗?
48+
* Usage: in(29)/out(59)/total(88)
49+
*/
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using System.Text;
2+
using Cnblogs.DashScope.Core;
3+
4+
namespace Cnblogs.DashScope.Sample.Text;
5+
6+
public class ChatStreamSample : ISample
7+
{
8+
/// <inheritdoc />
9+
public string Description => "Chat completion with stream output";
10+
11+
/// <inheritdoc />
12+
public async Task RunAsync(IDashScopeClient client)
13+
{
14+
var messages = new List<TextChatMessage>();
15+
messages.Add(TextChatMessage.System("You are a helpful assistant"));
16+
while (true)
17+
{
18+
Console.Write("User > ");
19+
var input = Console.ReadLine();
20+
if (string.IsNullOrEmpty(input))
21+
{
22+
Console.WriteLine("Please enter a user input.");
23+
return;
24+
}
25+
26+
messages.Add(TextChatMessage.User(input));
27+
var completion = client.GetTextCompletionStreamAsync(
28+
new ModelRequest<TextGenerationInput, ITextGenerationParameters>()
29+
{
30+
Model = "qwen-turbo",
31+
Input = new TextGenerationInput() { Messages = messages },
32+
Parameters = new TextGenerationParameters()
33+
{
34+
ResultFormat = "message",
35+
EnableThinking = true,
36+
IncrementalOutput = true
37+
}
38+
});
39+
var reply = new StringBuilder();
40+
var reasoning = false;
41+
TextGenerationTokenUsage? usage = null;
42+
await foreach (var chunk in completion)
43+
{
44+
var choice = chunk.Output.Choices![0];
45+
if (string.IsNullOrEmpty(choice.Message.ReasoningContent) == false)
46+
{
47+
// reasoning
48+
if (reasoning == false)
49+
{
50+
Console.Write("Reasoning > ");
51+
reasoning = true;
52+
}
53+
54+
Console.Write(choice.Message.ReasoningContent);
55+
continue;
56+
}
57+
58+
if (reasoning)
59+
{
60+
reasoning = false;
61+
Console.WriteLine();
62+
Console.Write("Assistant > ");
63+
}
64+
65+
Console.Write(choice.Message.Content);
66+
reply.Append(choice.Message.Content);
67+
usage = chunk.Usage;
68+
}
69+
70+
Console.WriteLine();
71+
messages.Add(TextChatMessage.Assistant(reply.ToString()));
72+
if (usage != null)
73+
{
74+
Console.WriteLine(
75+
$"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/reasoning({usage.OutputTokensDetails?.ReasoningTokens})/total({usage.TotalTokens})");
76+
}
77+
}
78+
}
79+
}
80+
81+
/*
82+
User > 你好
83+
Reasoning > 好的,用户发来“你好”,我需要友好回应。首先,应该用中文回复,保持自然。可以问好并询问有什么可以帮助的,这样既礼貌又开放。注意不要用太正式的语言,让对话轻松一些。同时,要确保回复简洁,避免冗长。检查有没有需要特别注意的地方,比如用户可能的需求或之前的对话历史,但这里看起来是第一次交流。所以,确定回复内容应该是:“你好!有什么我可以帮你的吗?” 这样既友好 又明确,鼓励用户进一步说明需求。
84+
Assistant > 你好!有什么我可以帮你的吗?
85+
Usage: in(19)/out(125)/reasoning(112)/total(144)
86+
*/

0 commit comments

Comments
 (0)