Skip to content

Commit

Permalink
multi chat and execute
Browse files Browse the repository at this point in the history
  • Loading branch information
0xFirekeeper committed Jan 17, 2025
1 parent 7a406de commit 3e199ac
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 18 deletions.
22 changes: 19 additions & 3 deletions Thirdweb.Console/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,26 @@

#region AI

var myChain = 11155111;
var myWallet = await SmartWallet.Create(personalWallet: await PrivateKeyWallet.Generate(client), chainId: myChain, gasless: true);

var nebula = await ThirdwebNebula.Create(client);
var myWallet = await PrivateKeyWallet.Generate(client);
var response = await nebula.Chat(prompt: "How much ETH is in my wallet?", wallet: myWallet, context: new NebulaContext(chainIds: new List<BigInteger> { 421614 }));
Console.WriteLine($"Response: {response.Message}");

// var response = await nebula.Chat(message: "What is my wallet address?", wallet: myWallet);
// Console.WriteLine($"Single Response: {response.Message}");

// var responses = await nebula.Chat(
// messages: new List<string> { "What's the symbol of this contract?", "How much ETH does it have?" },
// context: new NebulaContext(contractAddresses: new List<string> { "0xe2cb0eb5147b42095c2FfA6F7ec953bb0bE347D8" }, chainIds: new List<BigInteger> { myChain })
// );
// Console.WriteLine($"Multiple Responses: {responses.Message}");

// var receipt = await nebula.Execute(
// "Send a transaction with 0x data on sepolia to vitalik.eth using my wallet.",
// wallet: myWallet,
// context: new NebulaContext(chainIds: new List<BigInteger> { myChain })
// );
// Console.WriteLine($"Receipt: {JsonConvert.SerializeObject(receipt, Formatting.Indented)}");

#endregion

Expand Down
4 changes: 2 additions & 2 deletions Thirdweb/Thirdweb.AI/ThirdwebNebula.Types.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ internal class AgentAction
internal class ChatMessage
{
[JsonProperty("role")]
internal string Role { get; set; }
internal string Role { get; set; } = "user";

[JsonProperty("content")]
internal string Content { get; set; }
Expand Down Expand Up @@ -141,7 +141,7 @@ internal class ContextFilter
internal class CreateSessionParams
{
[JsonProperty("model_name")]
internal string ModelName { get; set; } = "t0-001";
internal string ModelName { get; set; } = Constants.NEBULA_DEFAULT_MODEL;

[JsonProperty("title")]
internal string Title { get; set; }
Expand Down
62 changes: 49 additions & 13 deletions Thirdweb/Thirdweb.AI/ThirdwebNebula.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ public class NebulaChatResult

public class NebulaExecuteResult
{
public ThirdwebTransactionReceipt TransactionReceipt { get; set; }
public string Message { get; set; }
public List<ThirdwebTransactionReceipt> TransactionReceipts { get; set; }
}

public class NebulaContext
Expand Down Expand Up @@ -67,11 +68,11 @@ public static async Task<ThirdwebNebula> Create(ThirdwebClient client, string mo
return nebula;
}

public async Task<NebulaChatResult> Chat(string prompt, IThirdwebWallet wallet = null, NebulaContext context = null)
public async Task<NebulaChatResult> Chat(string message, IThirdwebWallet wallet = null, NebulaContext context = null)
{
if (string.IsNullOrWhiteSpace(prompt))
if (string.IsNullOrWhiteSpace(message))
{
throw new ArgumentException("Prompt cannot be null or empty.", nameof(prompt));
throw new ArgumentException("Message cannot be null or empty.", nameof(message));
}

var contextFiler = await PrepareContextFilter(wallet, context);
Expand All @@ -80,7 +81,7 @@ public async Task<NebulaChatResult> Chat(string prompt, IThirdwebWallet wallet =
new ChatParamsSingleMessage()
{
SessionId = this.SessionId,
Message = prompt,
Message = message,
ContextFilter = contextFiler,
Config = wallet == null ? null : new ExecuteConfig() { Mode = "client", SignerWalletAddress = await wallet.GetAddress() }
}
Expand All @@ -91,28 +92,63 @@ public async Task<NebulaChatResult> Chat(string prompt, IThirdwebWallet wallet =
return new NebulaChatResult() { Message = result.Message, Transactions = transactions == null || transactions.Count == 0 ? null : transactions };
}

public async Task<NebulaExecuteResult> Execute(string prompt, IThirdwebWallet wallet = null, NebulaContext context = null)
public async Task<NebulaChatResult> Chat(List<string> messages, IThirdwebWallet wallet = null, NebulaContext context = null)
{
if (string.IsNullOrWhiteSpace(prompt))
if (messages == null || messages.Count == 0 || messages.Any(string.IsNullOrWhiteSpace))
{
throw new ArgumentException("Prompt cannot be null or empty.", nameof(prompt));
throw new ArgumentException("Messages cannot be null or empty.", nameof(messages));
}

var contextFiler = await PrepareContextFilter(wallet, context);

var result = await this.ChatClient.SendMessagesAsync(
new ChatParamsMultiMessages()
{
SessionId = this.SessionId,
Messages = messages.Select(prompt => new ChatMessage() { Role = "user", Content = prompt }).ToList(),
ContextFilter = contextFiler,
Config = wallet == null ? null : new ExecuteConfig() { Mode = "client", SignerWalletAddress = await wallet.GetAddress() }
}
);

var transactions = await PrepareTransactions(wallet, result.Actions);

return new NebulaChatResult() { Message = result.Message, Transactions = transactions == null || transactions.Count == 0 ? null : transactions };
}

public async Task<NebulaExecuteResult> Execute(string message, IThirdwebWallet wallet, NebulaContext context = null)
{
if (string.IsNullOrWhiteSpace(message))
{
throw new ArgumentException("Message cannot be null or empty.", nameof(message));
}

if (wallet == null)
{
throw new ArgumentException("Wallet cannot be null.", nameof(wallet));
}

var contextFiler = await PrepareContextFilter(wallet, context);
var result = await this.ExecuteClient.ExecuteAsync(
new ChatParamsSingleMessage()
{
SessionId = this.SessionId,
Message = prompt,
Message = message,
ContextFilter = contextFiler,
ExecuteConfig = wallet == null ? null : new ExecuteConfig() { Mode = "client", SignerWalletAddress = await wallet.GetAddress() }
ExecuteConfig = new ExecuteConfig() { Mode = "client", SignerWalletAddress = await wallet.GetAddress() }
}
);

Console.WriteLine(JsonConvert.SerializeObject(result));
// TODO
throw new NotImplementedException();
var transactions = await PrepareTransactions(wallet, result.Actions);
if (transactions == null || transactions.Count == 0)
{
return new NebulaExecuteResult() { Message = result.Message };
}
else
{
var receipts = await Task.WhenAll(transactions.Select(ThirdwebTransaction.SendAndWaitForTransactionReceipt));
return new NebulaExecuteResult() { Message = result.Message, TransactionReceipts = receipts.ToList() };
}
}

private static async Task<ContextFilter> PrepareContextFilter(IThirdwebWallet wallet, NebulaContext context)
Expand Down

0 comments on commit 3e199ac

Please sign in to comment.