131 lines
4.0 KiB
Python
131 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Simple Ollama Qwen3 Client
|
|
A standalone script to query Ollama's Qwen3 model
|
|
"""
|
|
|
|
import ollama
|
|
import sys
|
|
import argparse
|
|
|
|
|
|
def query_qwen3(prompt: str, model: str = "qwen3:4b", temperature: float = 0.7, stream: bool = False):
|
|
"""
|
|
Send a prompt to Qwen3 and get the response
|
|
|
|
Args:
|
|
prompt: The text prompt to send
|
|
model: Model name (default: qwen3:4b)
|
|
temperature: Sampling temperature (0.0-1.0, default: 0.7)
|
|
stream: Whether to stream the response (default: False)
|
|
|
|
Returns:
|
|
The model's response string
|
|
"""
|
|
try:
|
|
if stream:
|
|
# Streaming response
|
|
print("🤖 Qwen3 (streaming):\n", end="", flush=True)
|
|
full_response = ""
|
|
for chunk in ollama.generate(
|
|
model=model,
|
|
prompt=prompt,
|
|
stream=True,
|
|
options={'temperature': temperature}
|
|
):
|
|
content = chunk.get('response', '')
|
|
print(content, end="", flush=True)
|
|
full_response += content
|
|
print() # Final newline
|
|
return full_response
|
|
else:
|
|
# Non-streaming response
|
|
response = ollama.generate(
|
|
model=model,
|
|
prompt=prompt,
|
|
options={'temperature': temperature}
|
|
)
|
|
return response['response']
|
|
|
|
except Exception as e:
|
|
return f"❌ Error: {e}"
|
|
|
|
|
|
def interactive_mode(model: str = "qwen3:4b", temperature: float = 0.7):
|
|
"""Run in interactive chat mode"""
|
|
print(f"🤖 Qwen3 Chat Mode ({model})")
|
|
print("Type 'exit', 'quit', or press Ctrl+C to exit\n")
|
|
|
|
while True:
|
|
try:
|
|
prompt = input("You: ").strip()
|
|
if prompt.lower() in ['exit', 'quit', 'q']:
|
|
print("Goodbye!")
|
|
break
|
|
if not prompt:
|
|
continue
|
|
|
|
response = ollama.generate(
|
|
model=model,
|
|
prompt=prompt,
|
|
options={'temperature': temperature}
|
|
)
|
|
print(f"\nQwen3: {response['response']}\n")
|
|
|
|
except KeyboardInterrupt:
|
|
print("\nGoodbye!")
|
|
break
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description="Query Ollama's Qwen3 model",
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
epilog="""
|
|
Examples:
|
|
python ollama_qwen3.py "What is the capital of France?"
|
|
python ollama_qwen3.py -p "Explain quantum computing" --temp 0.3
|
|
python ollama_qwen3.py --interactive
|
|
echo "Hello world" | python ollama_qwen3.py --stdin
|
|
"""
|
|
)
|
|
|
|
parser.add_argument('prompt', nargs='?', help='The prompt text (optional if using --stdin)')
|
|
parser.add_argument('-p', '--prompt-file', help='Read prompt from file')
|
|
parser.add_argument('--model', default='qwen3:4b', help='Model name (default: qwen3:4b)')
|
|
parser.add_argument('--temp', type=float, default=0.7, help='Temperature 0.0-1.0 (default: 0.7)')
|
|
parser.add_argument('--stdin', action='store_true', help='Read prompt from stdin')
|
|
parser.add_argument('--interactive', '-i', action='store_true', help='Interactive chat mode')
|
|
parser.add_argument('--stream', action='store_true', help='Stream response')
|
|
|
|
args = parser.parse_args()
|
|
|
|
# Get prompt from various sources
|
|
if args.interactive:
|
|
interactive_mode(args.model, args.temp)
|
|
return
|
|
|
|
prompt = ""
|
|
if args.stdin:
|
|
prompt = sys.stdin.read().strip()
|
|
elif args.prompt_file:
|
|
with open(args.prompt_file, 'r') as f:
|
|
prompt = f.read().strip()
|
|
elif args.prompt:
|
|
prompt = args.prompt
|
|
|
|
if not prompt:
|
|
print("❌ No prompt provided. Use --help for usage information.")
|
|
sys.exit(1)
|
|
|
|
# Query model
|
|
if args.stream:
|
|
query_qwen3(prompt, args.model, args.temp, stream=True)
|
|
else:
|
|
response = query_qwen3(prompt, args.model, args.temp)
|
|
print(response)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|