Skip to main content
Glama

Financial AI Agent System

by NBWolfer
tools.js5.58 kB
// tools.js import 'dotenv/config'; // DEĞİŞİKLİK BURADA: import finnhub from 'finnhub'; import { Tool } from "@langchain/core/tools"; import { ChatOllama } from "@langchain/community/chat_models/ollama"; import { HumanMessage, SystemMessage } from "@langchain/core/messages"; const finnhubClient = new finnhub.DefaultApi('d1uf41hr01qpci1cb5tgd1uf41hr01qpci1cb5u0'); // Tüm araçların kullanabilmesi için LLM'i burada bir kere tanımlayalım const llm = new ChatOllama({ model: "gemma3:4b", baseUrl: "http://127.0.0.1:11434" }); // --- YARDIMCI FONKSİYON: PİYASA VERİSİ ÇEKME --- async function getMarketDataForAssets(assets) { console.log("--- Finnhub'dan canlı piyasa verileri çekiliyor... ---"); let marketDataReport = "Güncel Piyasa Verileri:\n"; const promises = assets.map(asset => new Promise((resolve) => { finnhubClient.quote(asset.symbol, (error, data, response) => { if (error || !data.c) { // Hata varsa veya fiyat verisi (c) yoksa resolve(`- ${asset.symbol}: Veri alınamadı.\n`); } else { resolve(`- ${asset.symbol}: Güncel Fiyat=${data.c}, Değişim=%${data.dp?.toFixed(2)}, Önceki Kapanış=${data.pc}\n`); } }); }) ); const results = await Promise.all(promises); marketDataReport += results.join(""); return marketDataReport; } // (Kodun geri kalanı aynı, değişiklik yok) // --- ARAÇ 1: Portföy Analiz Sürecinin Tamamı (GÜNCELLENDİ) --- class PortfolioAnalysisTool extends Tool { name = "portfolio_analysis_agent"; description = "Kullanıcının yatırım portföyünü analiz etmek, incelemek, değerlendirmek ve yatırım stratejileri sunmak için kullanılır. 'Portföyümü analiz et', 'yatırım tavsiyesi ver', 'portfolyomu inceler misin' gibi sorgularda bu aracı kullan."; async _call(customer_id) { console.log(`--- Portföy Analiz Agent'ı çalıştırılıyor | Müşteri: ${customer_id} ---`); const portfolioData = await this.fetchPortfolioData(customer_id); if (!portfolioData) return "HATA: Portföy verisi alınamadı."; const marketData = await getMarketDataForAssets(portfolioData.assets); console.log(marketData); const strategyResponse = await llm.invoke([ new SystemMessage("Sen bir Yatırım Stratejisi Danışmanısın. Sana verilen portföy özeti ve GÜNCEL piyasa verilerine dayanarak müşteriye 3 adet net, uygulanabilir ve ZAMANA DUYARLI tavsiye sun."), new HumanMessage(`Aşağıdaki bilgilere dayanarak bir yatırım stratejisi oluştur:\n\n### Portföy Özeti:\n${this._summarizePortfolio(portfolioData)}\n\n### ${marketData}`) ]); return `İşte güncel piyasa verilerine dayalı portföy analiziniz:\n\n${strategyResponse.content}`; } async fetchPortfolioData(customer_id) { try { // Gerçek senaryoda bu axios çağrısı olmalı. // Örnek veri, testlerin devamlılığı için bırakıldı. // const response = await axios.get(`http://127.0.0.1:3000/user-portfolio/${customer_id}`); // return response.data; return { user: { name: 'John Doe' }, assets: [{ symbol: 'AAPL', amount: 100 }, { symbol: 'TSLA', amount: 50 }, { symbol: 'SPY', amount: 200 }], portfolio_summary: { total_cash_balance: 50000 } }; } catch (error) { return null; } } _summarizePortfolio(data) { let summary_text = `Müşteri Adı: ${data?.user?.name || 'N/A'}\n`; summary_text += "Portföydeki Varlıklar:\n"; data?.assets.forEach(a => { summary_text += `- Sembol: ${a.symbol}, Miktar: ${a.amount}\n`; }); return summary_text; } } // --- ARAÇ 2: Risk Analiz Ajanı (GÜNCELLENDİ) --- class RiskAnalysisTool extends Tool { name = "risk_analysis_agent"; description = "Kullanıcının portföyündeki varlıkların GÜNCEL piyasa verilerine göre riskini analiz etmek için kullanılır."; async _call(customer_id) { console.log(`--- Risk Analiz Agent'ı çalıştırılıyor | Müşteri: ${customer_id} ---`); const portfolioData = await new PortfolioAnalysisTool().fetchPortfolioData(customer_id); if (!portfolioData) return "HATA: Portföy verisi alınamadı."; const marketData = await getMarketDataForAssets(portfolioData.assets); console.log(marketData); const riskResponse = await llm.invoke([ new SystemMessage("Sen bir Risk Analistisin. Sana verilen portföy özeti ve GÜNCEL piyasa verilerine bakarak volatilite ve piyasa riskini basitçe değerlendir."), new HumanMessage(`Portföy Özeti:\n${new PortfolioAnalysisTool()._summarizePortfolio(portfolioData)}\n\n### ${marketData}`) ]); return riskResponse.content; } } // --- ARAÇ 3: Genel Sohbet Ajanı (DEĞİŞİKLİK YOK) --- class GeneralChatbotTool extends Tool { name = "general_chatbot_agent"; description = "Genel sohbet, selamlama veya diğer araçların konusuna girmeyen herhangi bir soru için kullanılır."; async _call(query) { console.log(`--- Genel Sohbet Agent'ı çalıştırılıyor | Sorgu: ${query} ---`); const chatResponse = await llm.invoke([ new SystemMessage("Sen yardımsever bir asistansın."), new HumanMessage(query) ]); return chatResponse.content; } } export { PortfolioAnalysisTool, RiskAnalysisTool, GeneralChatbotTool };

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/NBWolfer/mcpServerNode'

If you have feedback or need assistance with the MCP directory API, please join our Discord server