<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0, 18.0)">If you use Visual Studio 2026 to create new extensions, you’ll notice that the lower bound will be automatically set to 17.0, with the upper bound left empty, as demonstrated in the example below.
<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0,)">This means that any new extensions created will now automatically target both Visual Studio 2022 and Visual Studio 2026! Despite the easy migration process, we still recommend that extenders test their extensions on Visual Studio 2026 to catch any compatibility bugs. If you find an issue is likely caused by the platform, please file a feedback ticket using Report a Problem. The smooth migration process for getting extensions in Visual Studio only applies to VSIX-based extensions. Developers who maintain MSI-based extensions are responsible for managing how users install them, and these MSI installers would need to adapt to this updated approach. Our general recommendation is that extension authors do not create MSI installers and just use VSIX to distribute their extensions.
All sales forecasts have this hockey stick shape because the people who do sales forecasts are all optimists.
The Microsoft finance division has their own variation on the hockey stick: The hockey stick on wheels.
Consider a team which presents their forecasts in the form of a hockey stick graph. They come back the next year with their revised forecasts, and they are the same as last year's forecast, just delayed one year. If you overlay this revised hockey stick forecast on top of the previous year's forecast, it looks like what happened is that the hockey stick slid forward one year. When this happens, the finance people jokingly call it a "hockey stick on wheels" because it looks like somebody bolted wheels onto the bottom of the hockey stick graph and is just rolling it forward by one year each year.
Net profit, net profit.
I love ya, net profit.
You're always a year away.
An example of a hockey stick on wheels is the first few years of the infamous Itanium sales forecast chart. Notice that the first four lines are basically the same, just shifted forward by one year. It is only at the fifth year that the shape of the line changes.
]]>But what about pifmgr.dll?
The pifmgr.dll file was added in Windows 95. Its job was, as the name might suggest, to manage PIF files, which are Program Information Files that describe how to set up a virtual MS-DOS session for running a specific application.
Whereas the icons in moricons.dll were created with specific programs in mind (list) and the icons in progman.exe were created for general categories of applications, the story behind the icons in pifmgr.dll is much less complicated.
The icons in pifmgr.dll were created just for fun. They were not created with any particular programs in mind, with one obvious exception. They were just a fun mix of icons for people to use for their own homemade shortcut files.
MS-DOS logo | |
Umbrella | |
Play block | |
Newspaper | |
Apple with bite | |
Cloud with lightning | |
Tuba | |
Beach ball | |
Light bulb | |
Architectural column | |
Money | |
Desktop computer | |
Keyboard | |
Filing cabinet | |
Desk calendar | |
Clipped documents | |
Crayon with document | |
Pencil | |
Pencil with document | |
Dice | |
Window with clouds | |
Eye chart with magnifying class | |
Dominos | |
Hand holding playing cards | |
Soccer ball | |
Purse | |
Decorated tree Wizard's hat with wand | |
Race car with checkered flag | |
Cruise ship | |
Biplane | |
Inflatable raft | |
Traffic light | |
Rabbit | |
Satellite dish | |
Crossed swords | |
Sword and shield | |
Flail weapon | |
Dynamite and plunger |
I don't know if it was intentional, but I find it interesting that clouds were the theme image for Windows 95, and we have a window with clouds. At the same time we have an apple with a bite, but the bite is on the left hand side, as opposed to the right hand side in the logo of Apple Computer.
Coincidence? Tip of the hat? Subtle jab? You decide.
]]>After extensive beta testing, we're proud to deliver a stable release that combines performance, intelligence, and developer productivity. The features in this release have been proven in real-world scenarios, including powering some of the most demanding AI workloads in the world.
One of the most exciting additions is our new Semantic Reranking API, currently a private preview feature that brings AI-powered document reranking directly to your Cosmos DB containers. This feature leverages Azure's inference services to intelligently rank documents based on semantic relevance. If you want to be onboarded to the semantic re-ranking private preview - sign up here. For more information, contact us at CosmosDBSemanticReranker@Microsoft.com. Check out our demo sample here to test drive this, and other powerful semantic search features, in Python for Azure Cosmos DB.
from azure.cosmos import CosmosClient
# Initialize your client
client = CosmosClient(endpoint, key)
container = client.get_database("MyDatabase").get_container("MyContainer")
# Perform semantic reranking
results = container.semantic_rerank(
context="What is the capital of France?",
documents=[
"Berlin is the capital of Germany.",
"Paris is the capital of France.",
"Madrid is the capital of Spain."
],
options={
"return_documents": True,
"top_k": 10,
"batch_size": 32,
"sort": True
}
)
# Results are intelligently ranked by relevance
print(results)
# Output:
# {
# "Scores": [
# {
# "index": 1,
# "document": "Paris is the capital of France.",
# "score": 0.9921875
# },
# ...
# ]
# }
This feature enables you to build more intelligent applications that can understand context and meaning, not just keyword matching. Perfect for RAG (Retrieval-Augmented Generation) patterns in AI applications.
The new read_items
API revolutionizes how you retrieve multiple documents, offering significant performance improvements and cost savings over individual point reads.
# Define the items you want to retrieve
item_list = [
("item1", "partition1"),
("item2", "partition1"),
("item3", "partition2")
]
# Retrieve all items in a single optimized request
items = list(container.read_items(
items=item_list,
max_concurrency=100
))
# The SDK intelligently groups items by partition and uses
# optimized backend queries (often IN clauses) to minimize
# network round trips and RU consumption
Performance Benefits:
Say goodbye to manual retry logic for write operations! The SDK now includes built-in retry capabilities for write operations that encounter transient failures.
# Enable retries at the client level
client = CosmosClient(
endpoint,
key,
connection_policy=ConnectionPolicy(retry_write=1)
)
# Or enable per-request
container.create_item(
body=my_document,
retry_write=1 # Automatic retry on timeouts/server errors
)
What Gets Retried:
Smart Retry Logic:
Custom User Agent: Identify your applications in telemetry:
# Set custom user agent suffix for better tracking
client = CosmosClient(
endpoint,
key,
user_agent_suffix="MyApplication/1.0"
)
Throughput Bucket Headers: Optimize performance monitoring (see here for more information on throughput buckets):
# Enable throughput bucket headers for detailed RU tracking
client = CosmosClient(
endpoint,
key,
throughput_bucket=2 # Set at client level
)
# Or set per request
container.create_item(
body=document,
throughput_bucket=2
)
Excluded Locations: Fine-tune regional preferences:
# Exclude specific regions at client level
client = CosmosClient(
endpoint,
key,
excluded_locations=["West US", "East Asia"]
)
# Or exclude regions for specific requests
container.read_item(
item="item-id",
partition_key="partition-key",
excluded_locations=["Central US"]
)
Streamline your workflows with the new return_properties
parameter:
# Get both the container proxy and properties in one call
container, properties = database.create_container(
id="MyContainer",
partition_key=PartitionKey(path="/id"),
return_properties=True
)
# Now you have immediate access to container metadata
print(f"Container RID: {properties['_rid']}")
print(f"Index Policy: {properties['indexingPolicy']}")
Unlock advanced parallel change feed processing capabilities:
# Get feed ranges for parallel processing
feed_ranges = container.get_feed_ranges()
# Query specific feed ranges for optimal parallelism
for feed_range in feed_ranges:
items = container.query_items(
query="SELECT * FROM c WHERE c.category = @category",
parameters=[{"name": "@category", "value": "electronics"}],
feed_range=feed_range
)
Enhanced Change Feed: More flexible change feed processing:
# New change feed mode support for fine-grained control
change_feed_iter = container.query_items_change_feed(
feed_range=feed_range,
mode="Incremental", # New mode support
start_time=datetime.utcnow() - timedelta(hours=1)
)
Enhanced support for AI workloads with vector embedding policy updates:
# Update indexing policy for containers with vector embeddings
indexing_policy = {
"indexingMode": "consistent",
"vectorIndexes": [
{
"path": "/vector",
"type": "quantizedFlat"
}
]
}
# Now you can replace indexing policies even when vector embeddings are present
container.replace_container(
container=container_properties,
indexing_policy=indexing_policy
)
Weighted RRF for Hybrid Search: Enhance your search relevance with Reciprocal Rank Fusion:
# Use weighted RRF in hybrid search queries
query = """
SELECT c.id, c.title, c.content
FROM c
WHERE CONTAINS(c.title, "machine learning")
ORDER BY RRF(VectorDistance(c.embedding, @vector),
FullTextScore(c.content, "artificial intelligence"),
[0.7, 0.3])
"""
items = container.query_items(query=query, parameters=[
{"name": "@vector", "value": search_vector}
])
Computed Properties have graduated from preview to general availability:
# Define computed properties for efficient querying
computed_properties = [
{
"name": "lowerCaseName",
"query": "SELECT VALUE LOWER(c.name) FROM c"
}
]
# Replace container with computed properties
container.replace_container(
container=container_properties,
computed_properties=computed_properties
)
# Query using computed properties for better performance
items = container.query_items(
query="SELECT * FROM c WHERE c.lowerCaseName = 'john doe'"
)
The SDK now includes sophisticated session token management:
Enable partition-level circuit breakers for enhanced fault tolerance:
import os
# Enable circuit breaker via environment variable
os.environ['AZURE_COSMOS_ENABLE_CIRCUIT_BREAKER'] = 'true'
# The SDK will automatically isolate failing partitions
# while keeping healthy partitions available
More resilient retry logic with cross-regional capabilities.
import logging
from azure.cosmos import CosmosHttpLoggingPolicy
# Set up enhanced logging logging.basicConfig(level=logging.INFO) client = CosmosClient( endpoint, key, logging_policy=CosmosHttpLoggingPolicy(logger=logging.getLogger()) )
Many of these features were developed in collaboration with OpenAI, who use Cosmos DB extensively for ChatGPT's data storage needs. This partnership ensures our SDK can handle:
When you use the Python SDK for Azure Cosmos DB, you're leveraging the same technology that powers some of the world's most advanced AI applications.
Based on testing with synthetic workloads:
retry_write
Parameter Type# Before (4.13.x and earlier)
retry_write = True # boolean
# After (4.14.0)
retry_write = 3 # integer (number of retries)
This change aligns with other retry configuration options and provides more granular control.
Update your dependencies:
pip install azure-cosmos==4.14.0
Update retry_write usage (if applicable):
# Old way
client = CosmosClient(endpoint, key, retry_write=True)
# New way
client = CosmosClient(endpoint, key, retry_write=3)
Leverage new features (optional but recommended):
Take advantage of read_items for batch operations
Enable automatic write retries for resilience
Use return_properties to reduce API calls
This release establishes the foundation for even more exciting AI-focused features coming in future versions:
Have feedback or questions? We'd love to hear from you!
azure-cosmosdb
and python
Ready to upgrade? Install Azure Cosmos DB Python SDK v4.14.0 today and experience the power of AI-enhanced database operations!
pip install --upgrade azure-cosmos==4.14.0
The future of AI-powered applications starts with the right data foundation. With the latest Cosmos DB Python SDK, you have the tools to build intelligent, scalable, and resilient applications that can handle anything the world throws at them.
]]>Illustrations of some of dogs' breeds images presented on the dataset.
We’ll use the Vision Fine-Tuning API and compare the results to a lightweight CNN baseline, so you can see the impact of modern Vision-Language Models versus traditional approaches. You’ll learn how to:{"model": “gpt-4o-batch”,
"messages": [
{"role": "system", "content":"Classify the following input image into one of the following categories: [Affenpinscher, Afghan Hound, ... , Yorkshire Terrier]." },
{"role": "user", "content":
[ {"type": "image_url", "image_url": {"url": "b64", "detail": "low"}} ]} ]}
This JSONL contains:
After having waited 15 minutes, the Batch API returned an output JSONL that contains for each line the model’s response.
Azure AI Foundry Batch job details.
Now, let’s extract the Batch API output response and compute the performance of the base model against the test set that will become our baseline.{"messages": [
{"role": "system", "content": "Classify the following input image into one of the following categories: [Affenpinscher, Afghan Hound, ... , Yorkshire Terrier]."},
{"role": "user", "content":
[{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,<encoded_springer_spaniel_image_in_base64>", "detail": "low"}}]},
{"role": "assistant", "content": "Springer Spaniel"}
]}
Here we've selected the following hyper-parameters for fine-tuning:
Azure AI Foundry Fine-Tuning job details
Azure AI Foundry Fine-Tuning job metrics
Aspect | Base gpt-4o (zero-shot) | Fine-Tuned gpt-4o | CNN Baseline |
Mean accuracy (more is better) | 73.67% | 82.67% (+9.0 pp vs base) | 61.67% (-12.0 pp vs base) |
Mean latency (less is better) | 1665ms | 1506ms (-9.6%) | — (not benchmarked here) |
Cost (less is better) | Inference costs only $$ | Training + Hosting + Inference $$$ | Local infra $ |
This plan requires that the function that accepts the callback lambda never tries to copy the lambda, because our RAII type is not copyable. (If it were copyable, the one-time action will get executed twice, once when the original and destructs, and once when the copy destructs.) But what if the function requires a copyable lambda?
void MySpecialFeature::OnButtonClick()
{
auto ensureDismiss = wil::scope_exit([self = shared_from_this()]
{ self->DismissUI(); });
try {
auto folder = PickOutputFolder();
if (!folder) {
return;
}
if (ConfirmAction()) {
if (m_useAlgorithm1) {
// StartAlgorithm1 invokes the lambda when finished.
StartAlgorithm1(file,
[ensureDismiss = std::move(ensureDismiss)] { });
} else {
RunAlgorithm2(file);
}
}
} catch (...) {
}
}
Suppose that you get an error somewhere inside the call to StartAlgorithm1
because it tries to copy the non-copyable lambda. How can you make the lambda copyable while still getting the desired behavior of cleaning up exactly once, namely when the lambda is run?
Start by wrapping the RAII type inside a shared_ptr
:
// StartAlgorithm1 invokes the lambda when finished.
StartAlgorithm1(file, [ensureDismiss =
std::make_shared<decltype(ensureDismiss)>(move(ensureDismiss))]
{ ⟦ ... ⟧ });
There's a bit of repetitiveness because shared_
does not infer the wrapped type if you are asking to make a shared_
by move-constructing from an existing object, so we have to write out the decltype(ensureDismiss)
.
Inside the body, we reset the RAII type, which calls the inner callable. Since all of the copies of the lambda share the same RAII object, the reset()
call performs the cleanup operation on behalf of everybody.
// StartAlgorithm1 invokes the lambda when finished.
StartAlgorithm1(file, [ensureDismiss =
std::make_shared<decltype(ensureDismiss)>(move(ensureDismiss))]
{ ensureDismiss->reset(); });
In the weird case that all of the copies of the lambda are destructed without any of them ever being called, then when the final one destructs, it will destruct the RAII object, which will run the cleanup operation if it hasn't been done yet.
]]>