tools.js•5.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 };