Skip to content

Commit 477435a

Browse files
committed
Cached prompt in Anthropic
1 parent 764e4ba commit 477435a

File tree

3 files changed

+129
-36
lines changed

3 files changed

+129
-36
lines changed

src/KernelMemory.Extensions.FunctionalTests/Anthropic/AnthropicTests.cs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,31 @@ public AnthropicTests()
3434

3535
[Theory]
3636
[InlineData(AnthropicTextGenerationConfiguration.HaikuModelName)]
37-
[InlineData(AnthropicTextGenerationConfiguration.Sonnet35ModelName)]
38-
public async Task Simple_call_some_models(string modelName)
37+
//[InlineData(AnthropicTextGenerationConfiguration.Sonnet35ModelName)] //save money
38+
public async Task Simple_call_some_models(string modelName)
3939
{
4040
var client = new RawAnthropicClient(_serviceProvider);
41-
var parameters = new CallClaudeStreamingParams()
41+
var random = Guid.NewGuid().ToString();
42+
var parameters = new CallClaudeStreamingParams()
4243
{
4344
ModelName = modelName,
44-
System = "You are an helpful assistant!",
45-
Prompt = "What is the capital of the United States?",
45+
System = [
46+
SystemMessage.Create("You are an helpful assistant that will answer book question!"),
47+
//remember if we want to test this, we need to create a new cache for each call.
48+
SystemMessage.Create(random + "Quel ramo del lago di Como che volge a mezzogiorno tra due catene non interrotte di monti tutte a seni e a golfi a seconda dello sporgere e del rientrare di quelli vien quasi a un tratto a ristringersi e a prender corso e figura di fiume tra un promontorio a destra e un'ampia costiera dall'altra parte e il ponte che ivi congiunge le due rive par che renda ancor più sensibile all'occhio questa trasformazione e segni il punto in cui il lago cessa e l'Adda rincomincia per ripigliar poi nome di lago dove le rive allontanandosi di nuovo lascian l'acqua distendersi e rallentarsi in nuovi golfi e in nuovi seni La costiera formata dal deposito di tre grossi torrenti scende appoggiata a due monti contigui l'uno detto di san Martino l'altro con voce lombarda il Resegone dai molti suoi cocuzzoli in fila che in vero lo fanno somigliare a una sega talchè non è chi al primo vederlo purchè sia di fronte come per esempio di su le mura di Milano che guardano a settentrione non lo discerna tosto a un tal contrassegno in quella lunga e vasta giogaia dagli altri monti di nome più oscuro e di forma più comune Per un buon pezzo la costa sale con un pendio lento e continuo poi si rompe in poggi e in valloncelli in erte e in ispianate secondo l'ossatura de' due monti e il lavoro dell'acque Il lembo estremo tagliato dalle foci de' torrenti è quasi tutto ghiaia e ciottoloni il resto campi e vigne sparse di terre di ville di casali in qualche parte boschi che si prolungano su per la montagna Lecco la principale di quelle terre e che dà nome al territorio giace poco discosto dal ponte alla riva del lago anzi viene in parte a trovarsi nel lago stesso quando questo ingrossa un gran borgo al giorno d'oggi e che s'incammina a diventar città Ai tempi in cui accaddero i fatti che prendiamo a raccontare quel borgo già considerabile era anche un castello e aveva perciò l'onore d'alloggiare un comandante e il vantaggio di possedere una stabile guarnigione di soldati spagnoli che insegnavan la modestia alle fanciulle e alle donne del paese accarezzavan di tempo in tempo le spalle a qualche marito a qualche padre e sul finire dell'estate non mancavan mai di spandersi nelle vigne per diradar l'uve e alleggerire a' contadini le fatiche della vendemmia Dall'una all'altra di quelle terre dall'alture alla riva da un poggio all'altro correvano e corrono tuttavia strade e stradette più o men ripide o piane ogni tanto affondate sepolte tra due muri donde alzando lo sguardo non iscoprite che un pezzo di cielo e qualche vetta di monte ogni tanto elevate su terrapieni aperti e da qui la vista spazia per prospetti più o meno estesi ma ricchi sempre e sempre qualcosa nuovi secondo che i diversi punti piglian più o meno della vasta scena circostante e secondo che questa o quella parte campeggia o si scorcia spunta o sparisce a vicenda Dove un pezzo dove un altro dove una lunga distesa di quel vasto e variato specchio dell'acqua di qua lago chiuso all'estremità o piuttosto smarrito in un gruppo in un andirivieni di montagne e di mano in mano più allargato tra altri monti che si spiegano a uno a uno allo sguardo e che l'acqua riflette capovolti co' paesetti posti sulle rive di là braccio di fiume poi lago poi fiume ancora che va a perdersi in lucido serpeggiamento pur tra' monti che l'accompagnano degradando via via e perdendosi quasi anch'essi nell'orizzonte Il luogo stesso da dove contemplate que' vari spettacoli vi fa spettacolo da ogni parte il monte di cui passeggiate le falde vi svolge al di sopra d'intorno le sue cime e le balze distinte rilevate mutabili quasi a ogni passo aprendosi e contornandosi in gioghi ciò che v'era sembrato prima un sol giogo e comparendo in vetta ciò che poco innanzi vi si rappresentava sulla costa e l'ameno il domestico di quelle falde tempera gradevolmente il selvaggio e orna vie più il magnifico dell'altre vedute Per una di queste stradicciole tornava bel bello dalla passeggiata verso casa sulla sera del giorno 7 novembre dell'anno 1628 don Abbondio curato d'una delle terre accennate di sopra il nome di questa nè il casato del personaggio non si trovan nel manoscritto nè a questo luogo nè altrove Diceva tranquillamente il suo ufizio e talvolta tra un salmo e l'altro chiudeva il breviario tenendovi dentro per segno l'indice della mano destra e messa poi questa nell'altra dietro la schiena proseguiva il suo cammino guardando a terra e buttando con un piede verso il muro i ciottoli che facevano inciampo nel sentiero poi alzava il viso e girati oziosamente gli occhi all'intorno li fissava alla parte d'un monte dove la luce del sole già scomparso scappando per i fessi del monte opposto si dipingeva qua e là sui massi sporgenti come a larghe e inuguali pezze di porpora Aperto poi di nuovo il breviario e recitato un altro squarcio giunse a una voltata della stradetta dov'era solito d'alzar sempre gli occhi dal libro e di guardarsi dinanzi e così fece anche quel giorno Dopo la voltata la strada correva diritta forse un sessanta passi e poi si divideva in due viottole a foggia d'un ipsilon quella a destra saliva verso il monte e menava alla cura l'altra scendeva nella valle fino a un torrente e da questa parte il muro non arrivava che all'anche del passeggiero I muri interni delle due viottole in vece di riunirsi ad angolo terminavano in un tabernacolo sul quale eran dipinte certe figure lunghe serpeggianti che finivano in punta e che nell'intenzion dell'artista e agli occhi degli abitanti del vicinato volevan dir fiamme e alternate con le fiamme cert'altre figure da non potersi descrivere che volevan dire anime del purgatorio anime e fiamme a color di mattone sur un fondo bigiognolo con qualche scalcinatura qua e là Il curato voltata la stradetta e dirizzando com'era solito lo sguardo al tabernacolo vide una cosa che non s'aspettava e che non avrebbe voluto vedere Due uomini stavano l'uno dirimpetto all'altro al confluente per dir così delle due viottole un di costoro a cavalcioni sul muricciolo basso con una gamba spenzolata al di fuori e l'altro piede posato sul terreno della strada il compagno in piedi appoggiato al muro con le braccia incrociate sul petto L'abito il portamento e quello che dal luogo ov'era giunto il curato si poteva distinguer dell'aspetto non lasciavan dubbio intorno alla lor condizione Avevano entrambi intorno al capo una reticella verde che cadeva sull'omero sinistro terminata in una gran nappa e dalla quale usciva sulla fronte un enorme ciuffo due lunghi mustacchi arricciati in punta una cintura lucida di cuoio e a quella attaccate due pistole un piccol corno ripieno di polvere cascante sul petto come una collana un manico di coltellaccio che spuntava fuori. Si racconta che il principe di Condé dormi profondamente la notte avanti la giornata di Rocroi ma in primo luogo era molto affaticato secondariamente aveva già date tutte le disposizioni necessarie e stabilito ciò che dovesse fare la mattina Don Abbondio invece non sapeva altro ancora se non che l'indomani sarebbe giorno di battaglia quindi una gran parte della notte fu spesa in consulte angosciose Non far caso dell'intimazione ribalda nè delle minacce e fare il matrimonio era un partito che non volle neppur mettere in deliberazione Confidare a Renzo l'occorrente e cercar con lui qualche mezzo Dio liberi Non si lasci scappar parola altrimenti ehm aveva detto un di que bravi e al sentirsi rimbombar quell ehm nella mente don Abbondio non che pensare a trasgredire una tal legge si pentiva anche dell'aver ciarlato con Perpetua Fuggire Dove E poi Quant'impicci e quanti conti da rendere A ogni partito che rifiutava il pover'uomo si rivoltava nel letto Quello che per ogni verso gli parve il meglio o il men male fu di guadagnar tempo menando Renzo per le lunghe Si rammentò a proposito che mancavan pochi giorni al tempo proibito per le nozze e se posso tenere a bada per questi pochi giorni quel ragazzone ho poi due mesi di respiro e in due mesi può nascer di gran cose Ruminò pretesti da metter in campo e benchè gli paressero un po' leggieri pur s'andava rassicurando col pensiero che la sua autorità gli avrebbe fatti parer di giusto peso e che la sua antica esperienza gli darebbe gran vantaggio sur un giovanotto ignorante Vedremo diceva tra sè egli pensa alla morosa ma io penso alla pelle il più interessato son io lasciando stare che sono il più accorto Figliuol caro se tu ti senti il bruciore addosso non so che dire ma io non voglio andarne di mezzo Fermato così un poco l'animo a una deliberazione potè finalmente chiuder occhio ma che sonno che sogni Bravi don Rodrigo Renzo viottole rupi fughe inseguimenti grida schioppettate Il primo svegliarsi dopo una sciagura e in un impiccio è un momento molto amaro La mente appena risentita ricorre all'idee abituali della vita tranquilla antecedente ma il pensiero del nuovo stato di cose le si affaccia subito sgarbatamente e il dispiacere ne è più vivo in quel paragone istantaneo Assaporato dolorosamente questo momento don Abbondio ricapitolò subito i suoi disegni della notte si confermò in essi gli ordinò meglio s'alzò e stette aspettando Renzo con timore e ad un tempo con impazienza Lorenzo o come dicevan tutti Renzo non si fece molto aspettare Appena gli parve ora di poter senza indiscrezione presentarsi al curato v'andò con la lieta furia d'un uomo di vent'anni che deve in quel giorno sposare quella che ama Era fin dall'adolescenza rimasto privo de' parenti ed esercitava la professione di filatore di seta ereditaria per dir così nella sua famiglia professione negli anni indietro assai lucrosa allora già in decadenza ma non però a segno che un abile operaio non potesse cavarne di che vivere onestamente Il lavoro andava di giorno in giorno scemando ma l'emigrazione continua de' lavoranti attirati negli stati vicini da promesse da privilegi e da grosse paghe faceva sì che non ne mancasse ancora a quelli che rimanevano in paese Oltre di questo possedeva Renzo un poderetto che faceva lavorare e lavorava egli stesso quando il filatoio stava fermo di modo che per la sua condizione poteva dirsi agiato E quantunque quell'annata fosse ancor più scarsa delle antecedenti e già si cominciasse a provare una vera carestia pure il nostro giovine che da quando aveva messi gli occhi addosso a Lucia era divenuto massaio si trovava provvisto bastantemente e non aveva a contrastar con la fame Comparve davanti a don Abbondio in gran gala con penne di vario colore al cappello col suo pugnale del manico bello nel taschino de' calzoni con una cert'aria di festa e nello stesso tempo di bravería comune allora anche agli uomini più quieti L'accoglimento incerto e misterioso di don Abbondio fece un contrapposto singolare ai modi gioviali e risoluti del giovinotto Che abbia qualche pensiero per la testa argomentò Renzo tra sè poi disse son venuto signor curato per sapere a che ora le comoda che ci troviamo in chiesa Di che giorno volete parlare Come di che giorno non si ricorda che s'è fissato per oggi Oggi replicò don Abbondio come se ne sentisse parlare per la prima volta Oggi oggi abbiate pazienza ma oggi non posso Oggi non può Cos'è nato Prima di tutto non mi sento bene vedete Mi dispiace ma quello che ha da fare è cosa di così poco tempo e di così poca fatica E poi e poi e poi E poi che cosa E poi c'è degli imbrogli Degl'imbrogli Che imbrogli ci può essere Bisognerebbe trovarsi nei nostri piedi per conoscer quanti impicci nascono in queste materie quanti conti s'ha da rendere Io son troppo dolce di cuore non penso che a levar di mezzo gli ostacoli a facilitar tutto a far le cose secondo il piacere altrui e trascuro il mio dovere e poi mi toccan de' rimproveri e peggio Ma col nome del cielo non mi tenga così sulla corda e mi dica chiaro e netto cosa c'è Sapete voi quante e quante formalità ci vogliono per fare un matrimonio in regola Bisogna ben ch'io ne sappia qualche cosa disse Renzo cominciando ad alterarsi poichè me ne ha già rotta bastantemente la testa questi giorni addietro Ma ora non s'è sbrigato ogni cosa non s'è fatto tutto ciò che s'aveva a fare Tutto tutto pare a voi perchè abbiate pazienza la bestia son io che trascuro il mio dovere per non far penare la gente Ma ora basta so quel che dico Noi poveri curati siamo tra l'ancudine e il martello voi impaziente vi compatisco povero giovine e i superiori basta non si può dir tutto E noi siam quelli che ne andiam di mezzo Ma mi spieghi una volta cos'è quest'altr", CacheControl.Ephemeral)],
49+
Messages = [Message.Create("user", "Chi era Don Abbondio?")],
4650
MaxTokens = 5,
4751
};
4852

49-
var result = client.CallClaudeStreaming(parameters);
50-
var response = await result.ToListAsync();
51-
Assert.True(response.Count > 0);
53+
var result = await client.CallClaudeAsync(parameters);
54+
Assert.NotNull(result);
55+
Assert.True(result.Usage.CacheCreationInputTokens > 0);
56+
var writtenTokens = result.Usage.CacheCreationInputTokens;
57+
58+
//then call again we need cache to be used
59+
result = await client.CallClaudeAsync(parameters);
60+
Assert.NotNull(result);
61+
Assert.True(result.Usage.CacheCreationInputTokens == 0);
62+
Assert.Equal(writtenTokens, result.Usage.CacheReadInputTokens);
5263
}
5364
}

src/KernelMemory.Extensions/Anthropic/AnthropicTextGeneration.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using Microsoft.ML.Tokenizers;
33
using System.Collections.Generic;
44
using System.Linq;
5-
using System.Net.Http;
65
using System.Runtime.CompilerServices;
76
using System.Threading;
87
using System.Threading.Tasks;
@@ -52,8 +51,8 @@ public async IAsyncEnumerable<string> GenerateTextAsync(
5251
CallClaudeStreamingParams p = new CallClaudeStreamingParams
5352
{
5453
ModelName = _config.ModelName,
55-
System = "You are an assistant that will answer user query based on a context",
56-
Prompt = prompt,
54+
System = [SystemMessage.Create( "You are an assistant that will answer user query based on a context")],
55+
Messages = [Message.Create("user", prompt)],
5756
Temperature = options.Temperature,
5857
MaxTokens = options.MaxTokens ?? 2048
5958
};

0 commit comments

Comments
 (0)