From 1a9869b0d9da15e88314c913155425ec9291e4d0 Mon Sep 17 00:00:00 2001 From: zramsay Date: Fri, 20 Dec 2024 11:53:42 -0500 Subject: [PATCH] nice --- src/app/api/ollama/route.ts | 41 ++++++++ src/app/page.tsx | 39 +++++++- src/components/TextGenerationCard.tsx | 131 ++++++++++++++++++++++++++ src/services/ollamaService.ts | 35 +++++++ 4 files changed, 244 insertions(+), 2 deletions(-) create mode 100644 src/app/api/ollama/route.ts create mode 100644 src/components/TextGenerationCard.tsx create mode 100644 src/services/ollamaService.ts diff --git a/src/app/api/ollama/route.ts b/src/app/api/ollama/route.ts new file mode 100644 index 0000000..aaf2992 --- /dev/null +++ b/src/app/api/ollama/route.ts @@ -0,0 +1,41 @@ +import { NextRequest, NextResponse } from 'next/server' + +export async function POST(req: NextRequest): Promise { + try { + const { prompt } = await req.json() + + if (!prompt) { + return NextResponse.json( + { error: 'Prompt is required' }, + { status: 400 } + ) + } + + const response = await fetch('https://ollama.rxpwnz.xyz/api/generate', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + model: 'llama2', + prompt: prompt, + stream: false + }), + }) + + if (!response.ok) { + throw new Error(`Ollama API error: ${response.status}`) + } + + const data = await response.json() + return NextResponse.json({ response: data.response }) + } catch (error) { + console.error('Ollama generation error:', error) + return NextResponse.json( + { error: error instanceof Error ? error.message : 'Failed to generate text' }, + { status: 500 } + ) + } +} + +export const dynamic = 'force-dynamic' diff --git a/src/app/page.tsx b/src/app/page.tsx index 2e5358f..5d2b7ab 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -3,7 +3,9 @@ import React, { useState } from 'react' import WalletHeader from '../components/WalletHeader' import AIServiceCard from '../components/AIServiceCard' +import TextGenerationCard from '../components/TextGenerationCard' import { generateWithFlux, FluxGenerationResult } from '../services/fluxService' +import { generateWithOllama, OllamaGenerationResult } from '../services/ollamaService' import { processMTMPayment } from '../services/paymentService' interface WalletState { @@ -63,6 +65,26 @@ const Page: React.FC = (): React.ReactElement => { return generateWithFlux(prompt) } + const handleOllamaGeneration = async (prompt: string): Promise => { + if (!walletState.connected || !walletState.publicKey || !window.solflare) { + return { error: 'Wallet not connected' } + } + + // First process payment + const paymentResult = await processMTMPayment( + walletState.publicKey, + 2, // 2 MTM tokens for text generation + window.solflare + ) + + if (!paymentResult.success) { + return { error: paymentResult.error } + } + + // Then generate text + return generateWithOllama(prompt) + } + return (
@@ -86,13 +108,26 @@ const Page: React.FC = (): React.ReactElement => {
- {/* Add more AI service cards here */} + +
+ + {/* Info Section */} +
+

+ Powered by Flux AI and Ollama LLaMA2 • Requires MTM tokens for generation +

diff --git a/src/components/TextGenerationCard.tsx b/src/components/TextGenerationCard.tsx new file mode 100644 index 0000000..d4af425 --- /dev/null +++ b/src/components/TextGenerationCard.tsx @@ -0,0 +1,131 @@ +'use client' + +import React, { useState } from 'react' + +interface TextGenerationCardProps { + title: string + description: string + tokenCost: number + isWalletConnected: boolean + onGenerate: (prompt: string) => Promise<{ textResponse?: string, error?: string }> +} + +interface GenerationState { + loading: boolean + processing: boolean + textResponse: string | null + error: string | null +} + +const TextGenerationCard: React.FC = ({ + title, + description, + tokenCost, + isWalletConnected, + onGenerate +}) => { + const [inputText, setInputText] = useState('') + const [generationState, setGenerationState] = useState({ + loading: false, + processing: false, + textResponse: null, + error: null, + }) + + const handleGenerate = async (): Promise => { + if (!inputText || !isWalletConnected) return + + setGenerationState({ + ...generationState, + loading: true, + error: null, + }) + + try { + const result = await onGenerate(inputText) + + if (result.error) { + setGenerationState({ + ...generationState, + loading: false, + error: result.error, + }) + return + } + + if (result.textResponse) { + setGenerationState({ + loading: false, + processing: false, + textResponse: result.textResponse, + error: null, + }) + } else { + throw new Error('No response received') + } + } catch (error) { + setGenerationState({ + ...generationState, + loading: false, + error: error instanceof Error ? error.message : 'Generation failed', + }) + } + } + + return ( +
+
+
+

+ {title} +

+

{description}

+
+ Cost: {tokenCost} MTM +
+
+ +
+