Configuration¶
Provider Configuration¶
Configure your LLM provider with the appropriate credentials and settings.
Agent Configuration¶
Required: Session Manager
The session_manager parameter is required when creating an Agent.
from pathlib import Path
from nagents import Agent, SessionManager
session_manager = SessionManager(Path("sessions.db"))
agent = Agent(
provider=provider,
session_manager=session_manager,
system_prompt="You are a helpful assistant.", # (1)!
tools=[...], # (2)!
log_file="http_traffic.log", # (3)!
fail_on_invalid_tool=False, # (4)!
)
- Optional system prompt to define agent behavior.
- Optional list of tool functions.
- Optional HTTP traffic logging for debugging.
- Whether to raise an exception when the LLM calls an unknown tool.
Generation Configuration¶
Control generation parameters for fine-tuned responses:
from nagents import GenerationConfig
config = GenerationConfig(
temperature=0.7, # (1)!
max_tokens=1000, # (2)!
top_p=0.9, # (3)!
stop=["END"], # (4)!
)
async for event in agent.run(
"Write a story",
generation_config=config,
):
...
- Creativity level (0.0-2.0). Higher = more creative, lower = more focused.
- Maximum output tokens. Limits response length.
- Nucleus sampling threshold. Alternative to temperature.
- Stop sequences. Generation stops when these are encountered.
Temperature Guidelines
| Temperature | Use Case |
|---|---|
| 0.0 - 0.3 | Factual responses, code generation |
| 0.4 - 0.7 | Balanced creativity and coherence |
| 0.8 - 1.2 | Creative writing, brainstorming |
| 1.3 - 2.0 | Highly creative, experimental |
Environment Variables¶
Security Best Practice
Never hardcode API keys in your source code. Use environment variables instead.
Create a .env file:
Load and use in your code:
config.py
import os
from dotenv import load_dotenv # (1)!
from nagents import Provider, ProviderType
load_dotenv()
provider = Provider(
provider_type=ProviderType.OPENAI_COMPATIBLE,
api_key=os.getenv("OPENAI_API_KEY"),
model="gpt-4o-mini",
)
- Install with
pip install python-dotenv
HTTP Traffic Logging¶
For debugging, you can log all HTTP requests, responses, and SSE chunks to a file:
from pathlib import Path
from nagents import Agent, SessionManager
agent = Agent(
provider=provider,
session_manager=SessionManager(Path("sessions.db")),
log_file="http_traffic.log", # Enable HTTP logging
)
What Gets Logged
- Requests: Method, URL, headers, and body
- Responses: Status code, headers, and body
- SSE chunks: Individual server-sent events during streaming
Sample Log Output
================================================================================
[2024-01-15 10:30:45.123] SESSION: a1b2c3d4
================================================================================
--- REQUEST ---
[10:30:45.124] POST https://api.openai.com/v1/chat/completions
Headers: {
"Authorization": "Bearer sk-...",
"Content-Type": "application/json"
}
Body: {
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Hello"}],
"stream": true
}
--- RESPONSE ---
[10:30:45.456] Status: 200
Headers: {...}
--- SSE CHUNK ---
[10:30:45.460] data: {"choices":[{"delta":{"content":"Hello"}}]}
--- SSE CHUNK ---
[10:30:45.465] data: {"choices":[{"delta":{"content":"!"}}]}
Tool Hallucination Handling¶
When an LLM tries to call a tool that doesn't exist, you can control the behavior:
agent = Agent(
provider=provider,
session_manager=session_manager,
tools=[get_weather],
fail_on_invalid_tool=False, # (1)!
)
# LLM receives: "Unknown tool: search. Available tools: get_weather"
# LLM can then retry with a valid tool
- Default behavior - returns error to LLM, allowing it to self-correct.
from nagents import Agent, ToolHallucinationError
agent = Agent(
provider=provider,
session_manager=session_manager,
tools=[get_weather],
fail_on_invalid_tool=True, # (1)!
)
try:
async for event in agent.run("Search for restaurants"):
...
except ToolHallucinationError as e:
print(f"Unknown tool: {e.tool_name}")
print(f"Available: {e.available_tools}")
- Raises
ToolHallucinationErrorimmediately when an unknown tool is called.
Non-Streaming Mode¶
By default, nagents streams responses. For non-streaming mode:
async for event in agent.run("Hello", stream=False):
if isinstance(event, TextDoneEvent):
print(event.text) # Complete response at once
When to Use Non-Streaming
- When you need the complete response before processing
- For batch processing scenarios
- When latency to first token isn't important