diff --git a/financial-agent/agent/index_nevermined.ts b/financial-agent/agent/index_nevermined.ts index 84226c6..b433481 100644 --- a/financial-agent/agent/index_nevermined.ts +++ b/financial-agent/agent/index_nevermined.ts @@ -151,7 +151,7 @@ function createModelWithSessionId( customProperties: Record = {} ): ChatOpenAI { return new ChatOpenAI( - payments.observability.withHeliconeLangchain( + payments.observability.withLangchain( "gpt-4o-mini", OPENAI_API_KEY, agentRequest, @@ -172,7 +172,7 @@ async function ensureAuthorized( const authHeader = (req.headers["authorization"] || "") as string; const requestedUrl = `${NVM_AGENT_HOST}${req.url}`; const httpVerb = req.method; - const result = await payments.requests.startProcessingRequest( + const result = await payments.requests.startProcessingBatchRequest( NVM_AGENT_ID, authHeader, requestedUrl, @@ -201,8 +201,9 @@ app.post("/ask", async (req: Request, res: Response) => { const { agentRequest, requestAccessToken } = await ensureAuthorized(req); console.log("agentRequestId", agentRequest.agentRequestId); console.log("requestAccessToken", requestAccessToken); - const input = String(req.body?.input_query ?? "").trim(); - if (!input) return res.status(400).json({ error: "Missing input" }); + const inputs = req.body?.input_query ?? []; + if (!inputs || !Array.isArray(inputs) || inputs.length === 0) + return res.status(400).json({ error: "Missing input" }); let { sessionId } = req.body as { sessionId?: string }; if (!sessionId) sessionId = crypto.randomUUID(); @@ -211,25 +212,29 @@ app.post("/ask", async (req: Request, res: Response) => { const model = createModelWithSessionId(agentRequest); const runnable = createRunnable(model); - const result = await runnable.invoke( - { input }, - { configurable: { sessionId } } - ); - const text = - result?.content ?? - (Array.isArray(result) - ? result.map((m: any) => m.content).join("\n") - : String(result)); - + let outputs = []; + for (const input of inputs) { + console.log("Sending question to the agent", input); + const result = await runnable.invoke( + { input }, + { configurable: { sessionId } } + ); + const text = + result?.content ?? + (Array.isArray(result) + ? result.map((m: any) => m.content).join("\n") + : String(result)); + outputs.push(text); + } // After successful processing, redeem 1 credit for this request let redemptionResult: any; try { - redemptionResult = await payments.requests.redeemCreditsFromRequest( + redemptionResult = await payments.requests.redeemCreditsFromBatchRequest( agentRequest.agentRequestId, requestAccessToken, - 1n + BigInt(inputs.length) ); - redemptionResult.creditsRedeemed = 1; + redemptionResult.creditsRedeemed = inputs.length; console.log("redemptionResult", redemptionResult); } catch (redeemErr) { // eslint-disable-next-line no-console @@ -240,7 +245,7 @@ app.post("/ask", async (req: Request, res: Response) => { }; } - res.json({ output: text, sessionId, redemptionResult }); + res.json({ output: outputs, sessionId, redemptionResult }); } catch (error: any) { // eslint-disable-next-line no-console console.error("Error handling /ask", error); diff --git a/financial-agent/client/index_nevermined.ts b/financial-agent/client/index_nevermined.ts index 0409718..9c8fb8e 100644 --- a/financial-agent/client/index_nevermined.ts +++ b/financial-agent/client/index_nevermined.ts @@ -44,15 +44,11 @@ async function main(): Promise { nvmEnv, }); - for (let i = 0; i < questions.length; i += 1) { - const input = questions[i]; - // eslint-disable-next-line no-console - console.log(`\n[CLIENT] Sending question ${i + 1}: ${input}`); - const response = await askAgent(baseUrl, input, sessionId, bearer); - sessionId = response.sessionId; - // eslint-disable-next-line no-console - console.log(`[AGENT] (sessionId=${sessionId})\n${response.output}`); - } + console.log("Sending batch of questions to the agent"); + console.table(questions); + const responses = await askAgent(baseUrl, questions, sessionId, bearer); + console.log("Received responses from the agent"); + console.log(responses.output); } /** @@ -65,17 +61,17 @@ async function main(): Promise { */ async function askAgent( baseUrl: string, - input: string, + inputs: string[], sessionId?: string, bearer?: string -): Promise<{ output: string; sessionId: string }> { +): Promise<{ output: string[]; sessionId: string }> { const res = await fetch(`${baseUrl}/ask`, { method: "POST", headers: { "Content-Type": "application/json", ...(bearer ? { Authorization: `Bearer ${bearer}` } : {}), }, - body: JSON.stringify({ input_query: input, sessionId }), + body: JSON.stringify({ input_query: inputs, sessionId }), }); if (!res.ok) { const errorText = await res.text().catch(() => ""); @@ -83,7 +79,7 @@ async function askAgent( `Agent request failed: ${res.status} ${res.statusText} ${errorText}` ); } - const data = (await res.json()) as { output: string; sessionId: string }; + const data = (await res.json()) as { output: string[]; sessionId: string }; return data; } diff --git a/financial-agent/package-lock.json b/financial-agent/package-lock.json index 86c0cdb..60a3eda 100644 --- a/financial-agent/package-lock.json +++ b/financial-agent/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@langchain/openai": "^0.3.10", - "@nevermined-io/payments": "^1.0.0-rc14", + "@nevermined-io/payments": "^1.0.0-rc16", "dotenv": "^16.4.5", "express": "^4.19.2", "langchain": "^0.2.14" @@ -24,7 +24,7 @@ }, "../../payments": { "name": "@nevermined-io/payments", - "version": "1.0.0-rc14", + "version": "1.0.0-rc16", "license": "Apache-2.0", "dependencies": { "@a2a-js/sdk": "^0.2.5", diff --git a/financial-agent/package.json b/financial-agent/package.json index e8b535f..ca23c96 100644 --- a/financial-agent/package.json +++ b/financial-agent/package.json @@ -16,7 +16,7 @@ }, "dependencies": { "@langchain/openai": "^0.3.10", - "@nevermined-io/payments": "^1.0.0-rc14", + "@nevermined-io/payments": "^1.0.0-rc19", "dotenv": "^16.4.5", "express": "^4.19.2", "langchain": "^0.2.14"