Ollama-Programmiersprachenintegration
Dieser Artikel stellt systematisch vier Codepfade zum Aufrufen von Ollama vor: die offizielle Python-Bibliothek, die offizielle JavaScript-Bibliothek, natives HTTP sowie OpenAI-/Anthropic-SDKs, und verbindet sie mit zwei praktischen Projekten.
Offizielles SDK: Python und JavaScript
Das offizielle Team pflegt direkt zwei Bibliotheken mit konsistentem API-Design; wenn Sie eine kennen, kennen Sie beide.
Installation
pip install ollama
# JavaScript / TypeScript
npm install ollama
Vergleich der Kernmethoden in den beiden Bibliotheken:
| Methode | Zweck | Wichtige Parameter |
|---|---|---|
| chat | Dialog mit mehreren Runden (Hauptmethode) | model、messages、stream、tools、think、format、options |
| generate | Textgenerierung für eine einzelne Runde | model、prompt、stream、suffix |
| embed | Vektor-Einbettung | model, input (einzelnes Element oder Array) |
| Liste | Lokale Modelle auflisten | Keine |
| pull | Ein Modell abrufen (Fortschritt kann überwacht werden) | model、stream |
Ein Chat-Aufruf mit vollständigen Parametern in Python deckt die meisten der in den vorherigen Artikeln gelernten Fähigkeiten ab:
Beispiel
from pydantic import BaseModel
# Schema für strukturierte Ausgabe definieren
class Answer(BaseModel):
site: str
free: bool
response = chat(
model='qwen3.5',
messages=[{'role': 'user', 'content': 'Python vorstellen'}],
stream=False, # Streaming-Umschalter
think=False, # Denkmodus-Umschalter
format=Answer.model_json_schema(), # Schema für strukturierte Ausgabe
options={'temperature': 0.3, 'num_ctx': 8192}, # Generierungsparameter
)
print(Answer.model_validate_json(response.message.content))
Der äquivalente Code in JavaScript:
Beispiel
// Streaming-Chat-Beispiel
const stream = await ollama.chat({
model: 'qwen3.5',
messages: [{ role: 'user', content: 'Stelle Python in drei Sätzen vor' }],
stream: true,
})
// Chunk für Chunk ausgeben
let content = ''
for await (const chunk of stream) {
process.stdout.write(chunk.message.content)
content += chunk.message.content
}
Wenn Sie eine Verbindung zu einer Nicht-Standard-Adresse (z. B. einem Remote-Server oder Ollama Cloud) herstellen, geben Sie sie mit host und headers an:
Beispiel
from ollama import Client
# Verbindung zu Remote-Ollama oder Ollama Cloud herstellen (Bearer-Authentifizierung)
Client = Client(
host='https://ollama.com',
headers={'Authorization': 'Bearer ' + os.environ.get('OLLAMA_API_KEY')},
)
response = client.chat(model='qwen3.5', messages=[
{'role': 'user', 'content': 'Stelle Python in einem Satz vor'}
])
Natives HTTP: curl Kurzreferenz
Beim Schreiben von Skripten, Debuggen von APIs oder bei der Fehlersuche ist curl das schnellste Werkzeug.
| Szenario | Befehl |
|---|---|
| Einzel-Turn-Generierung (nicht streamend) | curl http://localhost:11434/api/generate -d '{"model":"qwen3.5","prompt":Hello,"stream":false}' |
| Chat | curl http://localhost:11434/api/chat -d '{"model":"qwen3.5","messages":[...],"stream":false}' |
| Vektor-Einbettung | curl http://localhost:11434/api/embed -d '{"model":"embeddinggemma","input":"Text"}' |
| Modelle auflisten | curl http://localhost:11434/api/tags |
| Modelldetails | curl http://localhost:11434/api/show -d '{"model":"qwen3.5"}' |
| Ein Modell herunterladen | curl http://localhost:11434/api/pull -d '{"model":"qwen3.5:4b"}' |
| Ein Modell löschen | curl -X DELETE http://localhost:11434/api/delete -d '{"model":"qwen3.5:4b"}' |
OpenAI / Anthropic SDK wiederverwenden
Bei der Migration bestehender Projekte verursacht die Kompatibilitätsschicht deutlich weniger Aufwand als eine Neuimplementierung.
In einem JavaScript-Projekt das OpenAI SDK verwenden, um eine Verbindung zu lokalen Modellen herzustellen:
Beispiel
// Nur base_url ändern; api_key kann beliebig sein
const openai = new OpenAI({
baseURL: "http://localhost:11434/v1",
apiKey: "ollama",
})
const res = await openai.chat.completions.create({
model: "qwen3.5",
messages: [{ role: "user", content: "Stellen Sie Python in einem Satz vor" }],
})
console.log(res.choices[0].message.content)
Dasselbe gilt in einem Python-Projekt, das das Anthropic SDK verwendet:
Beispiel
# base_url auf lokal zeigen, der Schlüssel kann beliebig sein
client = anthropic.Anthropic(
base_url='http://localhost:11434',
api_key='ollama',
)
message = client.messages.create(
model='qwen3.5',
max_tokens=1024,
messages=[{'role': 'user', 'content': 'Stellen Sie Python in einem Satz vor'}],
)
print(message.content[0].text)
Empfehlung: Verwenden Sie für neue Projekte direkt das offizielle SDK (vollständigster Funktionsumfang); gehen Sie bei bestehenden Projekten über die Kompatibilitätsschicht basierend auf dem aktuellen SDK (minimale Änderungen); bei der Integration mit einem Framework, das nur das OpenAI-Protokoll unterstützt, ist die Kompatibilitätsschicht der einzige Weg.
Übung 1: Kommandozeilen-Chatskript
In weniger als 40 Zeilen Python: Kombiniere die Assemblierung, das Streaming und die Verlaufsverwaltung aus den früheren Abschnitten zu einem Terminal-Chat-Tool.
Beispiel
Ausführen: python cli_chat.py
from ollama import chat
MODEL = 'q3.5:4b'
# Sitzungsverlauf: System legt die Rolle fest, dann Konversationsnachrichten hinzufügen
messages = [{
'role': 'system',
'content': 'Du bist EXAMPLEs Programmierassistent. Antworte prägnant und gib Beispielcode an.',
}]
print(f'Chat starten (Modell {MODEL}), zum Beenden exit eingeben.')
while True:
user_input = input('\n'Du: ').strip()
if user_input.lower() == 'exit':
break
if not user_input:
continue
# Benutzernachricht anhängen und eine Streaming-Anfrage starten
messages.append({'role': 'user', 'content': user_input})
stream = chat(model=MODEL, messages=messages, stream=True)
# Stück für Stück ausgeben, während die vollständige Antwort akkumuliert wird
print('Assistent: ', end='', flush=True)
reply = ''
for chunk in stream:
reply += chunk.message.content
print(chunk.message.content, end='', flush=True)
# Wichtig: Die Antwort dieser Runde wieder an die Historie anhängen, damit sich das Modell den Kontext "merken" kann
messages.append({'role': 'assistant', 'content': reply})
$ python cli_chat.py 开始对话(模型 qwen3.5:4b),输入 exit 退出。 你:什么是 Python 的切片? 助手:切片是用 [start:stop:step] 从序列中取子序列的语法, 例如 s[1:3] 取索引 1 到 2 的元素。 你:给个 EXAMPLE 风格的例子 助手:s = "EXAMPLE" print(s[1:4]) # 输出 UNO 你:exit
Es gibt nur einen Kernpunkt: In jeder Runde sowohl die Nutzernachricht als auch die vollständige Assistentenantwort an messages anhängen. Das Modell selbst ist zustandslos; das "Gedächtnis" kommt vollständig aus dieser Liste.
Übung 2: Multi-Turn-Dialog-Web-App mit Gedächtnis
Dieselbe Idee in den Browser zu bringen erfordert ein Backend, das dazwischen koordiniert: den Gesprächsverlauf verwalten, Ollama aufrufen und die Streaming-Ergebnisse an das Frontend weiterleiten.
Backend: Flask-Wrapper für Ollama-Streaming-API
Beispiel
# Abhängigkeiten installieren: pip install flask ollama
from flask import Flask, request, Response, stream_with_context
from ollama import chat
app = Flask(__name__)
# Sitzungsverlauf wird vorübergehend im Speicher gespeichert: Ein echtes Projekt sollte stattdessen eine Datenbank verwenden
sessions = {}
@app.route('/chat')
def do_chat():
session_id = request.args.get('session', 'default')
user_input = request.args.get('q', '')
if not user_input:
return {'error': 'Fehlender q-Parameter'}
# Verlauf für diese Sitzung abrufen (oder initialisieren)
history = sessions.setdefault(session_id, [
{'role': 'system', 'content': 'Du bist der Programmierassistent von EXAMPLE.'}
])
history.append({'role': 'user', 'content': user_input})
# Streaming-Generierung, zeilenweise im NDJSON-Format an das Frontend weitergeleitet
def generate():
reply = ''
stream = chat(model='qwen3.5:4b', messages=history, stream=True)
for chunk in stream:
reply += chunk.message.content
yield chunk.message.content + '\n'
# Wichtig: Schreibe die vollständige Antwort zurück in den Verlauf, um ein Gedächtnis zu bilden
history.append({'role': 'assistant', 'content': reply})
return Response(
stream_with_context(generate()),
mimetype='application/x-ndjson',
)
if __name__ == '__main__':
app.run(port=5000)
Frontend: Streaming-Lesevorgänge abrufen
Beispiel
async function ask(question) {
const resp = await fetch(
`/chat?session=demo&q=${encodeURIComponent(question)}`
)
const reader = resp.body.getReader()
const decoder = new TextDecoder()
while (true) {
const { done, value } = await reader.read()
if (done) break
// Füge jeden Chunk zur Seite hinzu, sobald er eintrifft, für einen Schreibmaschineneffekt
document.getElementById('answer').textContent +=
decoder.decode(value)
}
}
Ausführen und Überprüfung
Beispiel
python server.py
# Simuliere zwei aufeinanderfolgende Anfragen, um den Speicher zu überprüfen
curl http://localhost:5000/chat?session=demo&q=什么YesPythonSlice
curl "http://localhost:5000/chat?session=demo&q=再GiveitemsEXAMPLEWind格ofExamples"
In der zweiten Anfrage setzt das Modell die Antwort entlang des Themas "Slicing" fort, was zeigt, dass die serverseitige Sitzungshistorie funktioniert; die Verwendung eines anderen Sitzungsparameters startet eine brandneue Sitzung ohne Beeinträchtigung.
Andere ErweiterungenDieses Skelett von ein paar Dutzend Zeilen deckt bereits die drei Schlüsselelemente einer ChatGPT-ähnlichen App ab: Sitzungsisolierung (Sitzungsparameter), Streaming-Erfahrung (NDJSON-Weiterleitung) und persistenter Speicher (History-Rückschreibung). Füge Datenbankspeicherung und eine Multi-Session-Liste hinzu, und es wird zum Prototyp eines vollständigen Praxisprojekts; das Kapitel „Web App Practice“ wird es weiter ausbauen.